Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何侦听servlet请求范围中的所有错误?_Java_Multithreading_Servlets_Error Handling_Listener - Fatal编程技术网

Java 如何侦听servlet请求范围中的所有错误?

Java 如何侦听servlet请求范围中的所有错误?,java,multithreading,servlets,error-handling,listener,Java,Multithreading,Servlets,Error Handling,Listener,我的web服务有3个servlet,它们实例化了同一个请求范围的对象,该对象存储有关当前请求的信息,如URL路径、使用的资源以及在执行过程中抛出的错误。其目的是记录这些错误,并将其作为客户端响应的一部分发送到JSON或XML中 我希望使用: public class ErrorEngine implements Thread.UncaughtExceptionHandler 创建一个类来捕获带有/不带有try-in-classes代码的所有错误,然后将它们保存到日志文件和稍后将转到客户端的数组

我的web服务有3个servlet,它们实例化了同一个请求范围的对象,该对象存储有关当前请求的信息,如URL路径、使用的资源以及在执行过程中抛出的错误。其目的是记录这些错误,并将其作为客户端响应的一部分发送到JSON或XML中

我希望使用:

public class ErrorEngine implements Thread.UncaughtExceptionHandler
创建一个类来捕获带有/不带有try-in-classes代码的所有错误,然后将它们保存到日志文件和稍后将转到客户端的数组中。我做到了:

public ErrorEngine() {
    super();
    Thread.setDefaultUncaughtExceptionHandler(this);
    System.out.println("Error Handler Engine Started.");
}

@Override
public void uncaughtException(Thread t, Throwable e) {
    System.out.println("Thread: "+t.getId()+"; Error: "+e.getMessage());        
}
错误处理程序引擎启动消息出现在控制台上,但当我在实例化错误处理程序的servlet的服务方法中使用by zero分区进行测试时,我为测试而创建的消息不会显示,只显示常规堆栈跟踪

那么,如何正确地侦听servlet请求范围中的所有错误呢


我想在它们各自的类和代码中处理它们,但我想从同一个位置记录它们,而不必在每次尝试/捕获时从错误处理程序类调用方法,即使错误可能出现在我没有为它们处理代码的位置,但是我必须在日志中看到它们。

最好的方法是实现另一个servlet,您可以将异常重定向到该servlet。在该servlet中,您可以处理异常并记录它。但是,除非抛出错误,否则它不能由和外部类处理和记录,您仍然必须在每个servlet中拥有日志基础结构,以便捕获和处理异常

以下是web.xml的外观:

<servlet>
        <servlet-name>ErrorHandler</servlet-name>
        <servlet-class>ErrorHandler</servlet-class>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
        <servlet-name>ErrorHandler</servlet-name>
        <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>java.lang.Throwable</exception-type >
    <location>/ErrorHandler</location>
</error-page>
以下是完整教程的链接:

您可以使用final doGet/final doPost创建一个MyBaseServlet,它分别调用try{}catchThrowable t{uncaughtExceptiont}包装的方法myDoGet/myDoPost

然后,每个servlet都应该扩展MyBaseServlet,并在需要时进行覆盖 myDoPost/myDoGet的默认实现,甚至是uncaughtException

错误处理程序引擎已启动 消息出现在控制台上,但当我使用按零除法进行测试时 在实例化错误的servlet的服务方法内部 处理程序,我为测试而创建的消息不会显示,只有 常规堆栈跟踪

您需要在Servlet的线程上设置ExceptionHandler,而不是错误处理程序的线程

见下面的例子

package test;

import java.lang.Thread.UncaughtExceptionHandler;

public class ErrorHandler implements UncaughtExceptionHandler {

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("Exception occurred in thread "+t.getName());
        System.out.println("Exception is "+e.getClass()+" ---------------");        
        System.out.println("Exception is "+e.getMessage());     
    }

}


package test;

public class ExceptionThrower {

    void test(){
        Thread.currentThread().setUncaughtExceptionHandler(new ErrorHandler());
        Object obj = null;
        System.out.println(obj.toString());
    }

    public static void main(String[] args) {
        new ExceptionThrower().test();
        System.out.println("After exception"); //this wont execute
    }
}
这就是输出

Exception occurred in thread main
Exception is class java.lang.NullPointerException ---------------
Exception is null

因此,如果/ErrorHandler中有错误,那么将有一个内循环…是否有OO方法?我需要错误数据保持在相同的请求范围内。当我将其发送到其他/uri时,我无法将错误信息作为所请求的服务发送的数据子集发送到我的客户端。因此,即使我们设置了DefaultUncaughtException!?在我的doGet中实例化的try/catch类中发生的错误怎么办?我相信我是这样做的,或者可能我没有在setUn上使用“.currentThread”。。。我将在星期一检查。提前谢谢。我可以在过滤链中这样做吗?