Я сделал что-то очень похожее. Но, во-первых, вам вообще не нужно передавать сообщение об ошибке пользователю. Нет смысла рассказывать им, как произошла ошибка, так как вы все равно будете ее регистрировать. (Имеет ли смысл, если пользователь знает, что ошибка произошла из-за NPE или ошибки ввода-вывода, даже если вы переименуете ее в более «дружественные» термины)?
Во-первых, вы можете рассмотреть возможность повторного выброса всех ваших исключений как исключений * (без проверки) во время выполнения . Это заставит ошибки регистрироваться централизованно и последовательно. В противном случае вам придется надеяться, что каждый экземпляр кода обработки ошибок будет регистрировать его правильно. Чтобы перебросить ваши SQLExceptions, например:
try{
conn.close();
} catch(SQLException ex){
//logger.error("Cannot close connection"); //don't log this here, do it centrally
throw new RuntimeException(ex);
}
Вы захотите перенаправить пользователей на страницу с общими ошибками, просто сообщив им, что произошла ошибка. Это указывает на то, что все, что они делали, не было обработано. Это очень важно, чтобы они не наносили ответный удар и продолжали пытаться вводить платеж снова и снова. сообщите им что-то пошло не так и либо (а) обратитесь в службу поддержки, либо (б) разместите на странице ошибки по умолчанию форму, в которой можно зарегистрировать тикет, либо отправить письмо в службу поддержки. Для этого вам необходимо определить это в своем файле web.xml:
<error-page>
<error-code>500</error-code>
<location>/Error.jsp</location>
</error-page>
Далее на странице error.jsp (или в сервлете) зарегистрируйте ошибку здесь, если ваш контейнер позволяет ссылаться на трассировку стека как request.getAttribute("javax.servlet.error.message"));
.
ИЛИ , создайте фильтр, который действует только на ответ, и выполните следующие действия:
try {
chain.doFilter(req, res);
} catch (Exception e) {
logger.error("pass any Mapped Diagnostic Context here", e); //log here, centrally
throw new RuntimeException(e); //throws back to the container so that the error page will be seen
}
Это будет перехватывать все распространенные исключения (непроверенные и неперехваченные), регистрировать их, а затем повторно выбрасывать, чтобы они вызывали страницу ошибки. Это сделает сообщение об ошибке
- Точный (один журнал на экземпляр ошибки)
- Надежно (если пользователь получил ошибку, вы получите данные регистрации
- Непротиворечивый (стандартизированный, если вы реализуете повторную передачу проверенных исключений как непроверенную, вы сможете увидеть все исключения, а также запретить пользователям перемещаться по подверженной ошибкам территории, где вы рискуете выполнить катастрофические миссии по очистке данных, потому что они вставили дерьмо в таблицы или таблицы ключей слева не заселены)
Наконец, вы можете рассмотреть возможность использования log4j и использования приложения, которое выводит куда-то, что вы можете просмотреть ошибки, не дожидаясь, пока операционные команды отправят их вам. Гораздо проще, если вы регулярно поддерживаете приложение.