你会如何拦截所有例外情况?

nkr*_*1pt 5 java exception interceptor

根据您的原因,拦截Java应用程序中所有异常的最简单方法是什么?是否需要AOP来提供这种功能,还是可以使用动态代理来完成,还是有其他方式?最简单的解决方案是否也是影响执行性能的良好解决方案?我想听听更有经验的开发人员可能的解决方案,因为我正在努力掌握有关该主题的技术知识.

编辑:

感谢您提出的好建议,但目前的建议是否仅适用于已检查的例外情况?那些未经检查的异常,比如NullPointerExceptions,如果可以捕获它们并且捕获它们的应用程序转储堆/堆栈以便在崩溃时为您提供应用程序的当前上下文,那么它会不会有用呢?

小智 11

您希望拦截每个异常的目的是什么 - 用于记录,错误报告?

拦截Java程序的每一行中的每个异常都是可能的,但可能会产生相当大的性能损失.如果它是不可避免的,那么最好使用类似AspectJ的东西,它可以在编译时运行(即它"编织"到你的类文件中),因此比动态代理要快得多.

但这是我试图避免不惜一切代价做的事情!一般来说,我会说最好限制你想要捕获的异常的范围.您也可以查看Thread.setDefaultUncaughtExceptionHandler,我觉得这对于在GUI应用程序中显示错误对话框很有用.


Tay*_*ese 9

与Phil的回答类似,这里有一些示例代码,展示了如何使用未捕获的异常处理程序.这适用于已检查和未检查的异常.

编辑:已更新以根据问题中的更新注释打印堆栈跟踪.

import java.lang.Thread.UncaughtExceptionHandler;

public class Test {

    public static void main(String[] args) throws Exception {
        Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {

            @Override
            public void uncaughtException(Thread t, Throwable e) {
                e.printStackTrace();
            }}

        );

        // throw new RuntimeException(); /* this works too */
        throw new Exception();
    }

}
Run Code Online (Sandbox Code Playgroud)


小智 5

在Nate和Konamiman ......你所建议的内容根本不起作用,也没有回答OP的问题.

如果OP从你的try/catch中启动一个新线程怎么办?

例如:

public static void main(String[] args) {
    try {
        final Thread t = new Thread( new Runnable() {
            public void run() {
                System.out.println( 3 / Math.min(0,4) );
            }
        } );
        t.start();
    catch(Throwable t) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你没有抓住异常.

正确的方法是使用Thread.setDefaultUncaughtExceptionHandler.