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