2012-04-21 3 views
4

У меня есть веб-приложение Java среднего размера, использующее Log4J как фреймворк. Прямо сейчас я просматриваю обработку Exception и Logging, чтобы сделать приложение более надежным. Он работает на Tomcat 6, с пружиной, спящим и Struts2 в качестве рамок.Ловить и регистрировать все необработанные исключения с помощью Log4J

Что бы я хотел сделать, это зарегистрировать исключение EVERY UNHANDLED, которое происходит в приложении. Чтобы я мог их зарегистрировать, сделайте log4j отправьте мне электронное письмо, а затем посмотрите, где я не вижу блоки try-catch. И, наконец, измените мой код соответственно.

Причина: сейчас все необработанные исключения печатаются непосредственно на экране, и мои пользователи обычно не удосуживаются копировать мне исключения.

Я знаю, что могу читать tomcat-журналы, но я бы хотел, чтобы они обрабатывались log4j, чтобы я мог получать электронное письмо на каждое такое исключение.

Любые предложения?

+2

Вы должны стремиться к исключению исключений HANDLING в любом месте, кроме одного места в вашем коде, - так называемого барьера исключения. Это очень доступно для веб-приложения. Вам необходимо связать каждый вызов с кодом контроллера с помощью try-catch. То же самое касается обработки транзакций в спящем режиме. –

+1

Ну, есть исключения (каламбур) для вышеуказанного правила, где вы можете захотеть поймать определенные исключения как часть логики приложения.Простым примером может быть преобразование текстового ввода в число, где вы не хотите, чтобы ваше приложение вышло из строя из-за неправильного ввода. Однако я искренне согласен с барьером исключения для необработанных исключений. – erikxiv

+1

@MarkoTopolnik Не нужно обматывать каждый вызов контроллера в try-catch, когда есть декларативные средства для исключения исключений как в спецификации Servlet, так и в Struts2 (может быть, даже Spring, не знаю). Также вы получаете одно место для обработки исключений, но с гораздо меньшим количеством шаблонов по всему коду. –

ответ

4

С Struts2 вы можете определить global exception mappings для конкретных типов Exception. Если вы определяете один для java.lang.Exception он выступает в качестве догоняющего все для каких-либо исключений не отображаются в другом месте:

<global-exception-mappings> 
    <exception-mapping exception="com.example.MyException result="myError" /> 
    <exception-mapping exception="java.lang.Exception" result="error" /> 
</global-exception-mappings> 

<global-results> 
    <result name="myError">/myError.jsp</result> 
    <result name="error">/error.jsp</result> 
</global-results> 

В вашей ошибке JSP-страницах (*), вы можете зарегистрировать их с log4j и предоставить пользователь хорошая страница с ошибкой «Что-то пошло не так», не встречая их с запутанными стеками.

(*) better: Ошибка action, где вы можете зарегистрировать исключение, и только затем Struts визуализировать JSP, где вы сообщаете пользователю, что что-то пошло не так. Не нужно загромождать JSP с кодом регистрации.

О внесении изменения всего кода:

Не добавляйте вслепую ловить блоки всего кода - если какая-то часть коды не может обрабатывать исключение, только пусть он распространяется (добавление пункта throws на подписи метода, если это необходимо). На некоторых уровнях в стеке, рассмотреть обертывание выброшенного исключения и добавление некоторой информации, чтобы помочь идентифицировать причину и повторно выдать его:

catch (IllegalArgumentException ex) { 
    // Always pass the original exception along, never just the message. 
    // It's much easier to find the root cause that way. 
    throw new UpdateException("Failed to parse foo object: " + foo, ex); 
} 

Кроме того, противостоять искушению блоков улова пусты. Они проглатывают исключение, и вы, возможно, никогда не узнаете, что что-то или что может быть неправильным в вашей заявке. Записывайте все исключения, если вы не уверены, что их никогда не будет интересовать.

+0

Вот почему я использую Stackoverflow! Спасибо дружище! – user829237

0

Создать страницу ошибки, смотрите здесь: How to show user-friendly error page in browser when runtime exception is thrown by servlet?

На странице ошибки вы можете добавить Java-код для входа исключения с log4j.

Примечание: обычно считается неправильной практикой, чтобы поместить java-код в JSP, но при входе в систему ошибка JSP - это одно место, где я считаю приемлемым.

Смежные вопросы