在java中捕获所有抛出的异常?

Posted

技术标签:

【中文标题】在java中捕获所有抛出的异常?【英文标题】:Capture all thrown exceptions in java? 【发布时间】:2014-08-22 16:09:01 【问题描述】:

我怀疑这样的事情是可能的,但是如果不将调试器附加到 java 应用程序,是否有可能在一些集合中填充有关 java 应用程序中生成的每个异常的信息,无论它是否被捕获?我知道在 .NET 中,应用程序会生成有关异常的消息,此时称为“第一次机会异常”,这些异常可能随后由应用程序处理,也可能不处理。我想知道 java 中是否有类似的机制,我可以利用它来查看有关在运行时生成的所有异常的信息。

只是为了澄清。这与发生异常的上下文无关。这个问题与我在 catch 块中所做的事情或未处理的异常无关。它是关于了解 JVM 是否提供了一种机制来查看运行时生成的每个异常,而不管它是由什么生成的,或者是上下文。

【问题讨论】:

为什么不想捕获异常?如果它被捕获只需将堆栈跟踪添加到 log4j 或类似的东西? 我们有一个客户,他一直认为他可以从我们的应用程序生成的完整异常列表中获取有意义的信息,无论它们是否未处理。我们还希望避免重构大部分代码库以执行您建议的操作,并在每个 try 语句中捕获异常数据。 也许这有帮助:***.com/questions/23561555/… 你的客户被骗了。归根结底,此类技术细节不应成为您客户的关注点。 顺便说一句,接受的答案不是很准确。它拦截异常构造,但不拦截异常抛出。并非所有构造的异常都被抛出,也不是所有抛出的异常都被构造。 【参考方案1】:

为什么不呢,当然有可能!但首先.. 记录 JVM 遇到的所有异常是浪费生命。它在任何意义上都没有意义,可能会抛出几个没有任何意义的异常。

但如果你确实别无选择,你可以调整你的 Java 来做到这一点。

打破良好编程的每一条规则,我们为之而活,我给你这个想法:

    java.lang.Exception的源代码从JDK源复制到你的项目中。

    在您的 Exception.java 中创建一个方法,如下所示:

    private void logException() 
        // Your logging routine here.
    
    

    编辑 java.lang.Exception 以在每个构造函数的末尾调用此方法 logException()

    将新的 java.lang.Exception 添加到 bootstrap 类路径。

    设置您的日志记录级别等并运行

抬起你的头,把这个展示给你奇怪的客户,使用你的外交技巧并用几句话吓唬他们'我们可以做到......但风险自负'。你可能会说服他不要使用这个。

【讨论】:

这个我试过了,我想应该还不错,还有一个问题,做完这样的事情感觉很脏是正常的吗? 是的,完全是。这是进行反演示的最佳方法之一。开个玩笑,这样做会破坏经过良好测试的产品的一致性,严重损害并发性,在没有详尽系统测试的情况下增加未经测试的代码的影响(不仅是您的代码,JVM 也是如此),并且可能有很多事情我太困了想想,晚安。

以上是关于在java中捕获所有抛出的异常?的主要内容,如果未能解决你的问题,请参考以下文章

捕获Java线程池执行任务抛出的异常

捕获在不同线程中抛出的异常

java 异常捕获小记

php try catch 捕获哪些错误

java中如何获取throws抛出的异常,并且把异常打印到指定的jsp页面

是否可以捕获 JavaScript 异步回调中抛出的异常?