Я нахожу два приемлемых варианта использования catch(Exception)
:
- На верхнем уровне приложения (непосредственно перед возвратом к пользователю). Таким образом, вы можете предоставить адекватное сообщение.
- Использование его для маскировки низкоуровневых исключений как бизнес-исключений.
Первый случай не требует пояснений, но позвольте мне развить второй:
Выполнение:
try {
// xxxx
} catch(Exception e) {
logger.error("Error XXX",e)
}
- это маскировка ошибок, как сказал @dimitarvp.
Но ниже все по-другому:
try {
// xxxx
} catch(Exception e) {
throw new BussinessException("Error doing operation XXX",e)
}
Таким образом, вы не игнорируете жуков и не прячете их под ковер. Вы предоставляете исключение высокого уровня с более пояснительным сообщением для более высоких прикладных уровней.
Также всегда важно управлять исключениями на правильном уровне. Если вы преобразуете низкоуровневое исключение в высокий бизнес-уровень, то для более высокого уровня практически невозможно хорошо справиться с ним.
В этом случае я предпочитаю маскировать низкоуровневые исключения с бизнес-исключениями, которые обеспечивают лучший контекст и сообщение, а также имеют оригинальное исключение, позволяющее углубиться в детали.
Несмотря на это, если вы можете поймать больше конкретных исключений и обеспечить лучшее лечение для них, вы должны это сделать.
Если в блоке кода вы можете получить SQLException
и NetworkException
, вы должны поймать их и предоставить адекватные сообщения и обработку для каждого из них.
Но если в конце блока try / catch у вас есть Exception
, отображающий его на BussinessException
, это нормально для меня.
На самом деле, я считаю это адекватным, когда более высокие уровни обслуживания только генерируют бизнес-исключения (с подробностями внутри).