gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:09:42 26 4
gpt4 key购买 nike

简短版:我如何捕获特定代码段中抛出的所有 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com