Рассмотрим некоторый код, который может генерировать проверенное исключение (исключение типа Exception
). Конечно, ваш код catch
является исключением. Вы не просто проглотили исключение, ваш код каким-то образом сообщает об этом пользователю через ваш пользовательский интерфейс. Возможно, в файле журнала или с помощью всплывающего окна с графическим интерфейсом.
Если текст, который вы сообщаете пользователю, включает текст сообщения об исключении. То есть текст, предоставленный Throwable.getMessage()
или Throwable.getLocalizedMessage()
?
Я думаю, что нет, но, похоже, многие со мной не согласны. Так что я не так понял? Мой аргумент заключается в следующем.
- Сообщение было создано при возникновении исключения. Поэтому в лучшем случае он может предоставлять информацию только очень низкого уровня, которая может быть неприемлемой для сообщения пользователю.
- С философской точки зрения использование сообщения кажется мне против всей точки исключения, которая заключается в том, чтобы отделить обнаружение и инициирование обработки ошибок (часть
throw
) от завершения обработки и создания отчетов (частьcatch
). Использование сообщения означает, что сообщение должно быть пригодным для создания отчетов, что переводит ответственность за отчетность в местоположение, которое должно отвечать только за обнаружение и инициирование. То есть, я бы сказал, чтоgetMessage()
часть дизайнаThrowable
была ошибкой. - Сообщение не локализовано. Несмотря на название,
getLocalizedMessage()
не очень хорош, потому что вы можете не знать, какую локаль вы хотите использовать, пока не сделаете исключениеcatch
(это отчет для перехода в системный журнал, прочитанный вашими английскими системными администраторами, или это всплывающее окно для французского пользователя GUI?). - Я слышал, что в Java 7 значительно улучшена иерархия исключений для
IOException
, что позволяет вам обрабатывать различные виды ошибок ввода-вывода в разных предложенияхcatch
, что делает текстgetMessage()
менее важным. Это подразумевает, что даже разработчикам на Java немного неудобно сgetMessage()
.
Я не спрашиваю, полезна ли отчетность по трассировке стека. Трассировка стека будет полезна только для исключения, которое предполагает ошибку. То есть для неконтролируемого исключения. Я думаю, что в таких обстоятельствах предоставление низкоуровневой детализации сообщения об исключении не только полезно, но и обязательно. Но мой вопрос касается проверенных исключений, таких как file-not-found.
И я не спрашиваю о "наилучшей практике" для текста сообщения.