用Java定义自定义异常处理程序?

时间:2015-10-26 10:28:45

标签: java exception-handling

好吧!谢谢你找到了答案。我接受了副本,因为它正是我想要的,并且很好地解释了。 感谢大家的答案:)

有没有人对如何在Java中创建自定义异常处理程序有任何建议或想法?

我的意思是修改代码未取消 ExceptionsErrors以及更一般Throwable的标准Java异常处理方法。

PHP的方法是define a custom exception handler,但似乎Java中没有这种方式。

我要实现的目标是在Java错误处理过程中插入自定义进程:

Uncatched Throwable - >通过JVM处理“我的代码之外” - >我的自定义流程 - >如果需要,恢复JVM标准异常处理

感谢大家的任何想法或建议!

在您的答案后编辑

有没有办法将此处理程序通用于所有线程而不在每个线程中明确声明? 我为这个主题开了一个新问题here

3 个答案:

答案 0 :(得分:5)

请注意,Javamultithreadedexceptionthreads相关。如果Exception未被捕获,您可以使用thread.setUncaughtExceptionHandler

 thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            System.out.println("catching exception "+e.getMessage());
        }
    });

或者您可以使用AOP方法并定义advice来处理异常。看看AspectJ

注意:你需要在这里小心,因为你最终可能会吞下异常,并且很难搞清楚bug的来源

答案 1 :(得分:2)

这可以通过以下线程完成:

public static void main(String[] args) {
    Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
        @Override public void uncaughtException(Thread t, Throwable e) {
            System.out.println("Caught: " + e.toString());
        }
    });
    throw new RuntimeException();
}

设置UncaughtExceptionHandler时,它会打印Caught: java.lang.RuntimeException而非经典堆栈跟踪。

带有lambda的Java 8版本:

Thread.currentThread().setUncaughtExceptionHandler(
        (t, e) -> System.out.println("Caught: " + e.toString()));

答案 2 :(得分:2)

是的,您可以使用Thread.setDefaultUncaughtExceptionHandler(CustomHandler)

JVM允许您通过实现Thread.UncaughtExceptionHandler接口

来自定义它

所以基本上

public class MyHandler implements Thread.UncaughtExceptionHandler {
  @Override
  public void uncaughtException(Thread t, Throwable e) {
     // handle the exception
   }
}