Вы правы, когда говорите, что ловить Throwable
- это не очень хорошая идея. Тем не менее, код, который вы представляете в своем вопросе, не улавливает Throwable
злым образом, но давайте поговорим об этом позже. В настоящее время, код, который вы представите в вашем вопросе имеет ряд преимуществ:
1. читаемость
Если посмотреть внимательно на код, вы увидите, что даже если блок поймать догоняет Throwable
, метод handleException
проверяет тип созданного исключения и, возможно, принимает разные действия на основе типа исключения.
Код, представленный в вашем вопросе является синонимом говоря:
try {
doSomething();
} catch (SQLEXception ex){
response = handleException(resource);
} catch(IllegalArgumentException ex) {
response = handleException(resource);
} catch(Throwable ex) {
response = handleException(resource);
}
Даже если вы должны поймать 10+ исключения только, этот код может легко занять много строк кода и мульти-улов конструкция не сделает код более чистым. Код, который вы представляете в своем вопросе, просто делегирует catch
другому методу, чтобы сделать реальный метод, который делает работу более читаемой.
2. Повторное использование
Код для метода handleRequest легко может быть изменен и помещен в служебный класс и доступ к всему приложению для обработки как Exception
с и Error
с. Вы даже можете извлечь метод на два метода private
; Один, который обрабатывает Exception
и тот, который обрабатывает Error
и имеет метод handleException
, который принимает Throwable
, дополнительно делегирует вызовы этим методам.
3.Maintainibility
Если вы решите, что вы хотите изменить способ Занести SQLException
сек в вашем приложении, вы должны сделать это изменение в одном месте, а не посещая каждый метод в каждом классе, который бросает SQLException
.
Так ловится Throwable
Плохая идея?
Код, который вы представляете в своем вопросе, на самом деле не то же самое, что ловить Throwable
. Следующий фрагмент кода не является большой нет-нет:
try {
doSomething();
} catch(Throwable e) {
//log, rethrow or take some action
}
Вы должны поймать Throwable
или Exception
, как далеко в catch
цепи, как это возможно.
Последнее, но не менее важно, помните, что код, который вы представляете в своем вопросе, является кодом фреймворка, и есть определенные ошибки, от которых инфраструктура все еще может восстановиться. См. When to catch java.lang.Error для лучшего объяснения.
Иногда, особенно в рамках, у вас нет другого выбора, кроме как поймать 'Throwable'. Это не очень хорошая идея в коде уровня приложения, если вы не хотите иметь какой-то «обработчик последней инстанции». – biziclop
У вас есть ссылка на открытый исходный код (например, исходный файл на GitHub)? Я могу представить несколько вариантов использования, где, в зависимости от контекста, это может быть хорошей стратегией. –
@James_pic там вы идете https://github.com/Eldelshell/jongo/blob/master/jongo-core/src/main/java/jongo/RestController.java –