java - 捕获所有 java.lang.Error 用于记录目的并允许它们在堆栈中向上工作

标签 java throwable

简短版:我如何捕获特定代码段中抛出的所有 java.lang.Error 以记录它们,并允许它们向上传播调用堆栈就好像我根本没有捕获它们一样?

长版...

在一段代码中,我想捕获所有 java.lang.Error 以便记录它们。但我也想让 Error 继续在调用堆栈中向上移动,这样行为就好像我根本没有捕捉到它一样。

此外,我想捕获并记录所有 java.lang.Exception,然后让它们也向上传播调用堆栈。

我试过了...

    } catch (Throwable e) {
        e.printStackTrace();
        throw e;
    } 

...但问题是我必须修改调用堆栈中更高层的每个方法以抛出 Throwable,其中一些方法不是我可以修改的(我的方法是由第三方框架中的方法调用)。

我对某种包装技术很满意,我会把 Throwable 放在别的东西里然后抛出它,但我更愿意让任何 java.lang.Error 以自然的方式向上传播,就好像我根本没有捕获它们一样。

建议?

编辑:有人问“我为什么要这样做?”。我认为这是一个很好的问题,我将澄清一下:这是我公司使用的框架。它取决于 jar 中包含的其他框架,系统管理员可能忘记包含这些框架。在这种情况下,代码中的某些地方会出现 NoClassDefFoundError。但是只有用户在浏览器中看到这个错误,在服务器日志中找不到。我想记录它,这样系统管理员就可以知道发生了这个错误,因为他会有处理它的说明。

最佳答案

你说:“我试过这个……”

    } catch (Throwable e) {
        e.printStackTrace();
        throw e;
    } 

你应该试试:

    } catch (Error e) {
        e.printStackTrace();
        throw e;
    } 

错误不是检查异常。您不必在任何方法签名中声明它们。只需将它放在最外层的方法中,它就会执行您想要的操作。

编辑:

如果你也想捕获并重新抛出Exception,我们考虑一下。您有三种 Throwable:Error、Exception 和 RuntimeException。不检查 Error 和 RuntimeException,但检查不是 RuntimeException 的 Exception。

因此,您可以像处理 Error 一样处理 RuntimeException:

    } catch (RuntimeException e) {
        e.printStackTrace();
        throw e;
    } catch (Error e) {
        e.printStackTrace();
        throw e;
    } 

那不是RuntimeException的Exception呢?需要了解的是,这些是已检查的异常,如果它们未在代码调用的方法中声明,则它们不会被抛出。所以你不需要捕捉/重新抛出它们。如果某些调用的方法实际上抛出这样的异常,那么您将不得不捕获/重新抛出它并将您的方法标记为抛出该异常,但是无论如何您都必须这样做,因为它们来自外部方法正在调用的方法。

关于java - 捕获所有 java.lang.Error 用于记录目的并允许它们在堆栈中向上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15190164/

相关文章:

java - 包名 - impl v internal

java - 博客中的这句话说函数必须在方法签名处声明 Throwable 才能捕获它,这句话是什么意思?

objective-c - 无法从Objective-C调用抛出的Swift函数

java - 底层流返回零字节

java - 尽管在 list 上设置了互联网权限,但我无法在 Android 设备上获取我的 IP

java - 如何在Spring框架和EJB3之间做出选择

java - 如何在 JUnit 中实例化共享资源

java - 确定哪种类型的异常是可抛出的

java - 如果 NoClassDefFoundError 是由 ClassNotFoundException 引起的,为什么 Java 期望您捕获两个可抛出的对象?

java - 在可抛出对象中重载 getCause() 方法