Исключения – советы по использованию

Обработка исключений – это встроенная возможность языка JAVA. Концепция обработки исключений позволяет сделать код более надежным и позволяет лучше читать и сопровождать его. Давайте посмотрим на конструкцию для обработки исключения:

В основном, код, который может вызвать исключение помещается в такую конструкцию. Блок catch описываемый для определенного исключения будет вызываться – т.е. если случится исключение TheException1, тогда будет вызван блок внутри его catch. Однако блок finally будет вызываться всегда, даже если какой-либо блок catch содержит return.
Таким образом думаю понятно, что блок try должен быть всегда. И всегда должен быть хотя бы один из блоков catch или finally.
Исходя из того, что блоков catch может быть много, система в случае исключения будет искать первый подходящий тип исключения. Причем с учетом наследования. Т.е. если вы ловите исключение IOException, то исключение FileNotFoundException, которрое является подклассом IOException будет обрабатываться в блоке try, который содержит IOException. Думаю, что это несложно.

Первый совет по обработке исключений: старайтесь обрабатывать специфические исключения. Т.е. если вы создали метод, который будет генерировать исключение FileNotFoundException – не декларируйте, что метод взывает исключение IOException. Нехорошо заставлять пользователя вашим классом обрабатывать исключение более высокого уровня, чем надо в действительности.

Второй совет: не делайте пустых catch блоков. Иными словами не делйте такой код.

Если даже логика вашего кода подразумевает полное отсуствие каких-либо действий при исключении – не поленитесь и напишите комментарий. Иначе пользватели вашего кода будут в затруднении.

Еще один добрый совет: Если метод класса вызывает исключение – пишите на него документацию. Используйте тэг @throws.

Наверняка вы знаете о RuntimeException и его подклассах. Эти исключения не требуют, чтобы их обрабатывали. И в общем не всегда их обработка будет выглядет логичной и нужной.
Но в некоторых случаях это будет логично и понятно. Например если вы ожидаете от пользователя ввода целого числа, которе вводится как строка. Для преобразования скорее всего будет использован методв parseInt, который вызывает runtime исключение NumberFormatException. Обычно runtime исключения обрабатываются тогда, когда необходимо восстановление при таких исключениях. Как в выше приведенном примере с parseInt.

Новые возможности Java 1.5 – UncaughtExceptionHandler

Мы уже говорили о том, что есть non-runtime исключения, которые вы обязаны помещать в блок try/catch и runtime, которые не требуют специальной обработки. Но бывают случаи, когда требуется обрабатывать и их – например вы хотите выводить все сообщения в определенном формате в какое-то окно сообщений. Расставлять по всему коду блоки try/catch конечно не очень удобное занятие.
Существуют три способа сделать обработку runtime исключений.
Вызвать метод setUncaughtExceptionHandler() у класса Thread.
Определить свой класс ThreadGroup и переопределить метод uncaughtException().
Вызвать статический метод класса Thread — setDefaultUncaughtExceptionHandler().

Методы setUncaughtExceptionHandler() и setDefaultUncaughtExceptionHandler() принимают в качестве аргумента класс, который реализует интерфейс UncaughtExceptionHandler.
Этот интерфейс имеет всего один метод

void uncaughtException(Thread t, Throwable e)

Рассмотрим в качестве примера два класса.

Первый класс представляет из себя окно, которое будет «всплывать» при возникновении исключнения. Окно реализует интерфейс UncaughtExceptionHandler.
Надо обратить внимание на два момента:
1. Это метод uncaughtException. Он реализует интерфейс
2. Метод addStackInfo. В общем-то в нем и происхожит основная работа.

Чтобы вы не пугались — EventQueue.invokeLater представляет из себя метод, который вызывается «в очереди» и что важно отметить делается асинхронно (в отдельном треде).

Все остальные вызовы достаточно очевидны – сделать окно видимым, вывести его на передний план, создать два потока для печати строк и вывести строки. В общем-то и все.

Второй класс сделан для того, чтобы продемонстрировать работу нашего окошка. Откомпилируйте и запускайте.

При запуске вы увидите окошко с ошибкой. Его можно закрыть и в консольном окне (где запущено приложение) нажмите Enter (как предлагается). И снова увидите окно с ошибкой. Причем важно отметить, что обе ошибки – runtime, но программа нормально продолжает свою работу.

Leave a reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.