当前位置: 首页 > 面试题库 >

Java未捕获的全局异常处理程序

薄鸿远
2023-03-14
问题内容

我有一个应用程序,需要编写一个自定义的全局未捕获的异常处理程序。我已经阅读了所有stackoverflow线程,并且其中每个线程都只是缺少一个清晰而简单的示例,说明了如何实现这一点。

考虑以下简单示例:

public static void log(String msg) throws Exception {

    String logPath = "/application/logs/java.log";

    Calendar c = new GregorianCalendar();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String now = format.format(c.getTime());

    PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(logPath, true)));
    out.println(now + "  " + msg);
    out.close();

}

它抛出一个标准异常,它只是一个标准输出。我如何实现自己的异常,该异常可以通过将错误输出到日志文件中的简单方法覆盖标准异常?显然,实际的应用程序要大得多,我们正在谈论未捕获的异常,这就是为什么不选择try
/ catch块的原因。

更新:
如果可以请给出一个非常清晰的完整示例,因为我发现了很多示例,例如提供的@RamonBoza,但我不知道如何实现它们,这就是这个问题的全部内容。

UPDATE2: 因此,我尝试测试下面答案中的唯一示例,显然它不起作用。我创建了一个新的类文件“ MyRunnable”,并将代码粘贴到其中:

package mypackage;

Thread t = new Thread(new MyRunnable());
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

    public void uncaughtException(Thread t, Throwable e) {
       LOGGER.error(t + " throws exception: " + e);
    }
});
t.start();

//outside that class
class MyRunnable implements Runnable(){
    public void run(){
        throw new RuntimeException("hey you!");
    }
}

不用说,我对此有很多错误。反正怎么会在课堂之外?

UPDATE3: 这是最终 可行 的解决方案:

package mypackage;

public class MyClass {

    public static void main(String[] args) throws Exception {

        Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
            public void uncaughtException(Thread t, Throwable e) { 
                StringWriter sw = new StringWriter();
                e.printStackTrace(new PrintWriter(sw));
                String stacktrace = sw.toString();
                System.out.println(stacktrace);
            }
        });

        //main method code

    }

    //Rest of the methods here

}

问题答案:

您可以为控制上述代码的线程设置UncaughtExceptionHandler:

// t is the parent code thread
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

    public void uncaughtException(Thread t, Throwable e) {
       LOGGER.error(t + " throws exception: " + e);
    }
 });

UncaughtExceptionHandler的
Java文档-

当线程由于未捕获的异常而即将终止时,Java虚拟机将使用Thread.getUncaughtExceptionHandler()向线程查询其UncaughtExceptionHandler并将调用处理程序的uncaughtException方法,并将线程和异常作为参数传递

setUncaughtExceptionHandler通常用于释放内存或杀死系统将无法杀死甚至可能保持僵尸状态的线程。

一个真实的例子:

Thread t = new Thread(new MyRunnable());
t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

    public void uncaughtException(Thread t, Throwable e) {
       LOGGER.error(t + " throws exception: " + e);
    }
});
t.start();

//outside that class
class MyRunnable implements Runnable(){
    public void run(){
        throw new RuntimeException("hey you!");
    }
}


 类似资料:
  • 问题内容: 我问一个有关如何覆盖默认的Java异常处理问题,被告知的答案在这里。 现在的问题是:是否有一种方法可以将该处理程序泛化为所有线程,而无需在每个线程中明确声明? 我认为应该可以某种方式获取所有线程,然后将其绑定到异常处理程序? 问题答案: 使用。正如javadoc所说: “通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程的未捕获异常处理方式(

  • 问题内容: 有没有一种方法可以在Java中创建全局异常处理程序。我想这样使用: 处理程序可能无法捕获在主体中引发的异常。 马丁 问题答案: 使用Thread.setDefaultUncaughtExceptionHandler。有关示例,请参见Rod Hilton的“ Global Exception Handling ”博客文章。

  • 统一错误处理 文档:https://eggjs.org/zh-cn/tutorials/restful.html 自定义一个异常基类 // app / exceptions / http_exceptions.js class HttpExceptions extends Error { constructor(msg='服务器异常', code=1, httpCode=400) {

  • 我正在尝试创建一个过滤器来处理异常(请参见在JSF中处理未捕获的异常) 我在日志中看到错误: 我做错了什么?

  • 问题内容: 因此,在此桌子上,我一直将头撞在桌子上几个小时,而且我什么都没走,因此我们将不胜感激。 下面的代码有两个jquery事件处理程序,它们会触发ajax请求。第一个使用GET,并且从服务器返回的数据是JSON编码的-它工作正常。返回的第二个(“ button#addTx”)使Firebug产生此错误: 未捕获的异常:[异常…“提示被用户终止” nsresult:“ 0x80040111(N

  • 本节介绍如何使用三个异常处理程序组件(try、catch 和 finally)来编写异常处理程序。 然后,介绍了 Java SE 7中引入的 try-with-resources 语句。 try-with-resources 语句特别适合于使用Closeable的资源(例如流)的情况。 本节的最后一部分将通过一个示例来分析在各种情况下发生的情况。 以下示例定义并实现了一个名为ListOfNumbe