Что лучше для обработки исключений?

1

У нас есть 5 возможных исключений, и мы хотим их обработать. Должен ли я использовать 5 разных улов или что-то вроде этого:

try {
  //...
}
catch(Exception e) {
 if(e instanceof IOException) 
 else if(e instanceof IllegalStateException)
}

Спасибо.

  • 1
    Примечание: вы можете использовать следующий синтаксис, если хотите применить одну и ту же операцию для разных исключений: catch (RuntimeException | IllegalAccessException e)
  • 0
    Примечание 2: instance of является доказательством недостатка дизайна. Есть несколько случаев, когда это ключевое слово строго необходимо.
Теги:
exception-handling

7 ответов

8
Лучший ответ

Использование 5 различных catch блоков, безусловно, лучше, чем эмуляция то же самое с instanceof оператором. Просто соблюдайте порядок правильности (в первую очередь исключение, а затем общее в конце):

try {

} catch (IOException exc) { 
    // do something
} catch (IllegalStateException exc) {
    // do something else
} catch (Exception exc) {
    // do something else for all remaining exceptions.
}

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

try {

} catch (IOException | IllegalStateException exc) { 
    // do something
}
  • 0
    В дополнение к этому, в JDK7 + вы можете 'группировать' обработку исключений, используя catch (IOException | IllegalStateException ex) если вы хотите выполнить одни и те же действия для разных исключений.
  • 0
    Я не сомневаюсь, что вы правы, но не могли бы вы объяснить, почему лучше иметь несколько блоков catch, чем использовать оператор instanceof ?
Показать ещё 3 комментария
2

Если вы поймаете Exception и затем имеете каскад if-else if s, вы рискуете усвоить любое исключение, которое не соответствует. Компилятор не будет принудительно выполнять предложение else throw e.

Кроме того, как только вы поймаете его как Exception, вы даже не можете его снова выбросить, если ваш метод не объявляет throw throws Exception, которого он не должен.

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

  1. они мешают вам делать то, что вам нужно;
  2. у вас есть очень целеустремленная и заслуживающая доверия команда разработчиков или, по крайней мере, дополнительные инструменты проверки.
1

Если вещи, которые выполняются для двух или более исключений, схожи, объедините их. Но если вы сделаете это, сделайте это правильно:

try {
    // foo
} catch (ExceptionClass1 | ExceptionClass2 | ExceptionClass3 e) {
    // error foo
}

Для получения дополнительной информации о множественной обработке исключений см.: Javadoc

0

В Java 7 мы можем использовать блок catch try, как показано ниже,

try
{
    catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
    {
       // code goes here
    }
}
0

Просто перейдите для множественного улова, а не используйте экземпляр

Java поддерживает несколько операторов catch по какой-либо причине, а с Java 7 вы можете даже использовать "multicatch" следующим образом:

try {
    ...
}
catch (IOException | OtherException | MyException e) {
    ...
}

Больше информации :-

http://baptiste-wicht.com/posts/2010/05/better-exception-handling-in-java-7-multicatch-and-final-rethrow.html

http://tutorials.jenkov.com/java-exception-handling/catching-multiple-exceptions.html

0

Вы должны окончательно использовать блок catch{} вместо эмулирования механики обработки исключений вручную.

Более новые версии Java позволяют объединять несколько исключений в одном блоке catch{}:

try {
  // ...
} catch (E1 | E2 | E3 e) {
  // handle e
}
0

Лучше всего использовать блоки catch с разными переменными исключения.

Точно как пример в вашем вопросе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню