gpt4 book ai didi

java - 抛出未处理的异常后线程卡住

转载 作者:行者123 更新时间:2023-12-02 06:30:29 24 4
gpt4 key购买 nike

我有一个 headless 运行的应用程序,需要能够向管理员通知问题。我构建了一个电子邮件通知框架供其使用,基本上,如果抛出并捕获异常,根据代码中的区域和异常的严重性,它可能会被传递到警报通知框架中,从而触发电子邮件发出向列出的管理员提供堆栈跟踪和其他调试信息。

这很有效。

在部署之前,我对其进行了测试。我的测试之一是从代码中的随机位置抛出未处理的异常 - 模拟潜在的严重运行时问题,其中抛出了我们没有预料到的异常。

例如,这是我插入测试未处理异常的方法:

/**
* Closes connection.
*/
public void closeConnection() {
if (true)
throw new NullPointerException("Test unexpected exception NPE");
LOG.info("Closing SFTP connection");
getSftpChannel().exit();
getSession().disconnect();
LOG.debug("SFTP Connection closed");

}

代码运行,当遇到这个未处理的异常时,程序会硬锁(因为抛出异常并且 sftp 连接线程永远不会关闭,因此它会保持 jvm 打开,直到连接超时)。

我原以为它会使 JVM 崩溃,或者将其传递给它的调用者,最终会冒泡到警报系统。

在这种情况下,我假设这个 NPE 会抛出这个异常,不会被它的调用者或调用者的调用者等处理,所以它应该冒泡到 main() ,然后使 JVM 崩溃,因为即使是 main不捕获Exception或NPE。

问题:这里发生了什么以及如何确保这样的场景不会在生产中挂起?我的 main() 是否有一个巨大的 catch-all catch 子句,并让它捕获所有Exception,以便处理每个异常?

为了清晰起见进行编辑:问题或多或少 - 为什么未在方法签名中显式抛出、也未由调用者处理的未处理异常不会崩溃JVM?

最佳答案

回答您的问题:为什么未在方法签名中显式抛出、也未由调用者处理的未处理异常不会导致 JVM 崩溃?

假设此代码在线程中运行,原因是,除非您在 Thread 类或 Thread 实例上设置了 UnhandledExceptionHandler,否则“主”线程组是默认UnhandledExceptionHandler。默认情况下,线程组通过将堆栈跟踪记录到 system.out 来处理未处理的异常,线程“死亡”并且 JVM 不会崩溃。

您可能需要考虑实现一个 UnhandledExceptionHandler,它使用您的电子邮件框架来通知您这些失败。

正如其他发帖者所建议的,代码应该在finally block 中清理 channel 和 session 等资源。

关于java - 抛出未处理的异常后线程卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103837/

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