【问题标题】:Terminate program and show error dialog on fatal exception终止程序并在致命异常上显示错误对话框
【发布时间】:2014-07-05 04:21:14
【问题描述】:

在发生致命异常的情况下,可以假设程序不再处于安全运行状态,应尽快终止。但是,我想通知用户发生了什么致命错误,而不需要他们搜索日志文件。是终止所有其他正在执行的Threads 的最佳解决方案吗,只保留当前线程以调用JDialog

这是我对解决方案的尝试:

public void killAlienThreads() {
    Thread[] threads;

    while ((threads = Thread.getAllStackTraces().keySet().toArray(new Thread[0])).length != 1) {
        for (Thread thread : threads) {
            if (thread != Thread.currentThread())
                thread.stop();
        }
    }
}

调用此方法后,当前线程继续提醒用户该问题,然后在剩余对话框处理完毕后关闭程序。

这段代码有很多问题。一方面,可以在尝试关闭所有线程时创建新线程,这需要一个只有在知道只剩下当前线程时才会中断的循环。此外,正如 Eclipse 警告我的那样,Thread.stop() 已被弃用,但不能保证Thread.interrupt() 立即停止线程。无论如何,这种方法并没有终止所有其他线程,而是简单地给了我InterruptedExceptions 的弹幕。

那么,如何安全地终止处于“不安全状态”的程序,同时仍然允许错误对话框通知用户?

编辑:

让我解释几件事以使我的问题更清楚。当我说“致命异常”时,我的意思是我的程序已捕获但不知道如何处理的已检查的Exception(不是Error)。当这些错误之一发生时,可以假定程序不再处于功能状态(或“不安全”),应尽快终止。但是,等待用户单击错误对话框上的“确定”按钮可能会花费无限时间。因此,我希望在“发生致命异常”时立即终止程序,而不必等待用户确认错误对话框并关闭它。

【问题讨论】:

  • “不安全状态”和“安全终止”在同一个短语中并没有真正的意义......我认为它可能的(Windows 用旧的 BSoD 做到了),但我不确定是否可以在 JVM 中这样做,因为您编写的代码通常不会在正确的级别上运行以处理 JVM 错误。
  • 不清楚你在问什么。如果您正在寻找代码审查,请尝试codereview.stackexchange.com。如果您想知道 JVM 是如何工作的,那就是这里。如果您想讨论 JVM 应该 的行为方式,那么我建议您这样做:chat.stackoverflow.com
  • @user3580294 我已经用更清晰的解释更新了这个问题。

标签: java multithreading exception-handling


【解决方案1】:

虽然抛出适当的异常通常会使许多对象处于有效状态,但调用像 Thead.stop() 这样的不安全方法可能会完全破坏重要状态并导致更糟糕的副作用。

最安全的方法是让主进程尽快死掉,用另一个守护进程报错。

如果您必须在 JVM 中执行此操作,您可能需要查看调试或检测 API,因为无法中断不调用可中断方法的线程。

【讨论】:

  • 您能否提供一个使用守护进程报告错误的示例?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多