Java - 当外部类捕获异常时进行监听

标签 java logging exception log4j

有没有办法在一个单独的类中创建一个监听器,以便在项目中捕获异常时运行特定的代码段?

我的代码中有很多 try-catch,如果捕获到异常,我希望使用 log4j 查看日志。我可以相当轻松地对每个 try-catch 执行以下操作(只需花费一些时间):

private static final Logger logger = LogManager.getLogger(Example.class);

public void testMethod() {
    try {
        // some code here that could throw an exception
    } catch(Exception e) {
        logger.error("Unexpected error has occurred: ", e);
    }
}

这将使用 log4j 记录异常。然而,我需要这样做超过 50 次,而且它是如此多余,以至于我宁愿能够使用 1 种方法来做到这一点。那么,有没有办法代替做这样的事情呢?

public class ListenerClass {

    private static final Logger logger = LogManager.getLogger(ListenerClass.class);

    // This method will be listening for exceptions to be caught within the project
    /**
     * @param e - The exception that was just caught
    */
    public void listenerMethod(ExceptionCaught e) {
        logger.error("An exception has been thrown: ", e);
    }

}

这可能吗?

谢谢

最佳答案

标准方式:

Thread.setDefaultUncaughtExceptionHandler( (thread, throwable) -> {
        log(throwable.getMessage(), thread.getId());
});

它将处理未捕获的RuntimeException,除非另有指定,否则它将作用于所有应用程序线程。

请记住,抛出异常是有原因的,不应被忽略,尤其是 RuntimeException

<小时/>

如果您使用旧版本的 java(8 之前),则必须显式实例化匿名类:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
      @Override
      public void uncaughtException(final Thread t, final Throwable e) {

      }
}); 

关于Java - 当外部类捕获异常时进行监听,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49498234/

相关文章:

java - 文本转语音 Android Studio

java - 七月到 TomEE 1.7.2 上的 SLF4J,带有 Maven 插件

Python - 在调用它的模块中的函数内部使用记录器

wcf - 如何从 Web 服务中获取异常?

c# - 进程因 StackOverFlowException C# 而终止

java - Celery 管理 java 任务

java - 识别输入来自嵌套列表中的特定列表

ruby-on-rails - 在 rails 3 中设置记录器

c# - 如何使用 AsyncPump 在异步控制台应用程序中保留异常上下文?

java - 如何从Struts Action类发送消息到jsp页面