Как эффективно обрабатывать любые исключения? - PullRequest
1 голос
/ 10 декабря 2010

Обработка исключений - самый полезный механизм для спасения приложения от сбоя.Даже большинство из нас следуют механизму обработки исключений.Даже я вижу, что многие все еще получают исключения.Обрабатываем ли мы исключения так, как должны?Мой вопрос: как лучше всего справиться с любым исключением?

Я хочу прояснить несколько вещей.Когда я говорю «обработка исключения», это означает не только захват соответствующего сообщения об исключении и его отображение или запись в журнал.Скорее, он предполагает обработку корректирующего действия для исключения.

Давайте рассмотрим этот фрагмент кода:

try {
  someMethod1();
} catch (MyException e) {
  System.out.println(e.getMessage());
} catch (YourException e) {
  System.out.println(e.getMessage());
}

В приведенном выше коде «MyException» и «YourException» могут не охватить все видыИсключения.Но, конечно, мы можем использовать «java.lang.Exception».Как бы мы определили правильный тип исключения?и как справиться с этим исключением?особенно при использовании внешних библиотек.

Более подробная информация по запросу.

Спасибо

Ответы [ 8 ]

7 голосов
/ 10 декабря 2010

Вы не хотите перехватывать исключения среды выполнения.Причина в том, что вы просто прячете ошибку прямо там.Вместо этого позвольте приложению завершиться сбоем и исправить его.Чтобы ответить на ваши вопросы, если вы поймаете Throwable, вы в основном сожрет любые исключения.

Правило большого пальца: ловите только исключения приложения.

4 голосов
/ 10 декабря 2010

Я не знаю, правильно ли я понимаю смысл вашего вопроса, но вы можете поймать столько исключений, сколько вам нужно в определенном блоке кода:

try {
  someMethod1();
} catch (MyException e) {
  System.out.println(e.getMessage());
} catch (YourException e) {
  System.out.println(e.getMessage());
} catch (IOException e) {
   //handle
} catch (SQLException e) {
   //handle
}

И, основываясь на иерархии исключений, когда вы перехватываете исключение, вы также перехватываете каждый подтип этого исключения, поэтому, когда вам нужно перехватить каждое непредвиденное состояние ошибки, вы можете добавить перехват для java.lang.Exception ( в последнем операторе catch)

try {
  someMethod1();
} catch (MyException e) {
  System.out.println(e.getMessage());
} catch (YourException e) {
  System.out.println(e.getMessage());
} catch (Exception e) {
   //handle generic unexpected exception
}

Вы также можете поймать суперинтерфейс Throwable, но это не рекомендуется, поскольку единственное отличие состоит в том, что, кроме исключений, вы также поймаете ошибки. Ошибки являются фатальными состояниями, которые не должны обрабатываться, поскольку они означают серьезные проблемы на виртуальной машине Java, такие как нехватка памяти, переполнение стека и т. Д.

Эти ссылки могут быть полезны для обработки исключений Java:

Привет.

1 голос
/ 10 декабря 2010

Тип любого объекта можно проверить с помощью отражения.Но я не очень люблю его использовать.

try {
    throw new Exception1();
} catch (Throwable t) {
    // just get name
    System.out.println(t.getClass().getName() + " caught");

    // or try instanceof - this is not nice approach IMO
    if (t instanceof Exception1) {
        System.out.println("yes exception1");
    }
}

Кстати, вы думали или слышали об АОП?Чтобы быть более точным об AspectJ.Аспектно-ориентированное программирование может быть ответом на ваш вопрос о том, как печатать или регистрировать исключения, в то время как ваш код еще чистый и легко обслуживаемый.Если вы используете Java EE и EJB, вы можете попробовать механизм перехватчиков вместо AspectJ.Я рекомендую вам прочитать кое-что о AOP и AspectJ (для Java).

cheers

1 голос
/ 10 декабря 2010

Если вы действительно хотите поймать каждое возможное исключение, то вам нужно поймать Throwable:

try {
    somethingThatMayFail();
} catch (Throwable t) {
    t.printStackTrace();
}

Чаще всего это плохая идея. Вы не должны отлавливать какие-либо исключения, если не знаете, почему они произошли или как их устранять. Не сбой - это не обязательно хорошая вещь - если ваша программа сломана, ответственным является сбой.вещь которую нужно сделать.Рассмотрим этот метод:

public Thing loadThing(long id){
    try {
        return doLoad(id);
    } catch (Throwable t) {
        // What do we do here?
    }
}

Компилятор заставляет вас возвращать или выбрасывать что-либо из каждого возможного пути выполнения метода, но только неисключительный путь позволяет нам возвращать что-то разумное.Мы могли бы вернуть null из предложения catch, но тогда вызывающий код мог бы забыть проверить возвращаемое значение для null, что означает, что вместо этого вы получите NullPointerException, который гораздо сложнее расшифровать, поскольку он не сообщаетВы что реальная ошибка была или где она произошла.

Исключения хороши.Есть причины, по которым они есть у каждого разумного языка.

1 голос
0 голосов
/ 10 декабря 2010

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

что-то вроде

» код ...

попытка { что-то.... } catch (someException e) { // справиться }

попытка { что-то.... } catch (someException e) { // справиться }

код ... «

Однако этот код не улавливает никаких исключений, которые могут возникнуть в противном случае (т. Е. Не из-за вашего кода). Для этого Outer Try Catch может помочь вам узнать, что это было что-то еще

как

» пытаться { код ...

попытка { что-то.... } catch (someException e) { // справиться }

попытка { что-то.... } catch (someException e) { // справиться } * * Тысяча двадцать-один

код ... } поймать (время выполнения е) { // сообщаем пользователю / журналу, что произошло что-то неожиданное } «

0 голосов
/ 10 декабря 2010

Похоже, вы пытаетесь понять, как узнать, когда вы обработали все возможные исключения. Если вы просто не включите в свой метод предложение throws, то компилятор сообщит вам, для каких исключений вам нужно добавить обработчики.

0 голосов
/ 10 декабря 2010

Ваш код правильный. Если метод someMethod1() не объявляет никаких других исключений, они являются исключениями RuntimeExceptions, и вы должны отлавливать RuntimeException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...