У нас есть 5 возможных исключений, и мы хотим их обработать. Должен ли я использовать 5 разных улов или что-то вроде этого:
try {
//...
}
catch(Exception e) {
if(e instanceof IOException)
else if(e instanceof IllegalStateException)
}
Спасибо.
Использование 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
}
catch (IOException | IllegalStateException ex)
если вы хотите выполнить одни и те же действия для разных исключений.
Если вы поймаете Exception
и затем имеете каскад if-else if
s, вы рискуете усвоить любое исключение, которое не соответствует. Компилятор не будет принудительно выполнять предложение else throw e
.
Кроме того, как только вы поймаете его как Exception
, вы даже не можете его снова выбросить, если ваш метод не объявляет throw throws Exception
, которого он не должен.
В заключение, придерживайтесь стандартных идиом, если:
Если вещи, которые выполняются для двух или более исключений, схожи, объедините их. Но если вы сделаете это, сделайте это правильно:
try {
// foo
} catch (ExceptionClass1 | ExceptionClass2 | ExceptionClass3 e) {
// error foo
}
Для получения дополнительной информации о множественной обработке исключений см.: Javadoc
В Java 7 мы можем использовать блок catch try, как показано ниже,
try
{
catch(IllegalArgumentException | SecurityException | IllegalAccessException | NoSuchFieldException e)
{
// code goes here
}
}
Просто перейдите для множественного улова, а не используйте экземпляр
Java поддерживает несколько операторов catch по какой-либо причине, а с Java 7 вы можете даже использовать "multicatch" следующим образом:
try {
...
}
catch (IOException | OtherException | MyException e) {
...
}
Больше информации :-
http://tutorials.jenkov.com/java-exception-handling/catching-multiple-exceptions.html
Вы должны окончательно использовать блок catch{}
вместо эмулирования механики обработки исключений вручную.
Более новые версии Java позволяют объединять несколько исключений в одном блоке catch{}
:
try {
// ...
} catch (E1 | E2 | E3 e) {
// handle e
}
Лучше всего использовать блоки catch с разными переменными исключения.
Точно как пример в вашем вопросе.
catch (RuntimeException | IllegalAccessException e)
instance of
является доказательством недостатка дизайна. Есть несколько случаев, когда это ключевое слово строго необходимо.