Подтвердить что ты не робот

Как захватить неперехваченные исключения в веб-приложении сервлетов Java

Есть ли стандартный способ захвата исключенных исключений, которые происходят внутри контейнера сервлетов Java, например tomcat или Jetty? Мы запускаем много сервлетов, которые поступают из библиотек, поэтому мы не можем легко надеть наш код try/catch. Было бы неплохо как в качестве общего пути, так и в качестве возможного уловить и зарегистрировать все неперехваченные исключения в нашем веб-приложении (которое работает в Jetty) на наш трекер ошибок через предоставленный API.

Пожалуйста, не нужно регистрировать только исключения, независимо от того, является ли проблема с перенаправлением на странице пользовательских ошибок, мне не поможет. Мы делаем все с помощью GWT-RPC, поэтому пользователь никогда не увидит страницу с ошибкой.

4b9b3361

Ответ 1

Я думаю, что пользовательский фильтр работает лучше всего.

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    try {
        chain.doFilter(request, response);
    } catch (Throwable e) {
        doCustomErrorLogging(e);
        if (e instanceof IOException) {
            throw (IOException) e;
        } else if (e instanceof ServletException) {
            throw (ServletException) e;
        } else if (e instanceof RuntimeException) {
            throw (RuntimeException) e;
        } else {
            //This should never be hit
            throw new RuntimeException("Unexpected Exception", e);
        }
    }
}

Ответ 2

В web.xml (дескриптор развертывания) вы можете использовать элемент <error-page> для указания страниц ошибок по типу исключений или Код состояния HTTP-ответа. Например:

<error-page>
    <error-code>404</error-code>
    <location>/error/404.html</location>
</error-page>
<error-page>
    <exception-type>com.example.PebkacException</exception-type>
    <location>/error/UserError.html</location>
</error-page>

Для описания, ориентированного на NetBeans, mosey on to Настройка веб-приложений: отображение ошибок в экранах ошибок (учебное пособие по Java EE 6) (или см. учебная версия Java EE 5).

Ответ 3

Не уверенность 100%, если это будет работать с контейнером сервлета, или как далеко вверх по течению этот вызов должен идти, но вы можете вызвать static setDefaultUncaughtExceptionHandler на Thread, чтобы установить обработчик, который будет обрабатывать все неперехваченные исключения.