Я работаю над обработкой ошибок в веб-проекте, который я делаю, и столкнулся со случаем, когда ошибка, которую я отображал пользователю, не была особенно полезной.Я использовал это, чтобы получить сообщение об ошибке для отображения моему пользователю:
catch (Throwable t) {
...
t.getMessage();
...
}
Это обычно работает хорошо и обычно дает пользователю лучшее сообщение, чем уродливая трассировка стека, которую он не знаетчто делать с.Однако в одном случае Hibernate выдавал исключение, и отображалось сообщение об ошибке:
не удалось вставить [some.class.name.Here]
, чтоочень бесполезно.Фактическая причина ошибки была скрыта в трассировке стека:
Допустимы только даты между 1 января 1753 года и 31 декабря 9999 года.
Учитывая первую ошибкусообщение, я бы понятия не имел, что пошло не так.Учитывая второе, я бы, по крайней мере, знал бы, чтобы посмотреть на дату, которую я ввел.Чтобы решить эту проблему, я сделал это:
catch (Throwable t) {
...
ExceptionUtils.getExceptionMessageWithCauses(t);
...
}
...
public class ExceptionUtils
{
public static String getExceptionMessageWithCauses(Throwable t)
{
if ( t.getCause() == null ) {
return t.getMessage();
} else {
return t.getMessage()
+ "; caused by: "
+ getExceptionMessageWithCauses(t.getCause());
}
}
}
Моя первая задача - попасть в какой-то бесконечный цикл, если два класса Throwable ссылаются друг на друга.Или, аналогично, первопричина настолько глубока, что даже отображение более удобного сообщения об ошибке из Throwables приводит к чему-то не лучше, чем трассировка стека.Итак, два вопроса:
"Безопасно ли" делать что-то подобное или люди могут подумать о случаях, когда это взорвется мне в лицо?
Есть ли лучший способ обработки исключений, кроме проверки каждой возможной ошибки по очереди?
Спасибо!