我正在开发一个使用普通threads
实现的项目。处理应用程序中的大多数预期异常,但是,有些情况下其中一个线程抛出意外异常而应用程序崩溃(应用程序同时基于I/O
和Client-Server
,所以它实际上是不可能处理所有例外)。
要解决此问题,我正在尝试定义全局UnhandledExceptionHandler
,以便应用程序显示友好消息而不是崩溃。这就是我试过的:
public partial class App : Application
{
private void Application_Startup(object sender, StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
// The rest of the startup logic goes here
}
void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Utilities.DisplayUnhandledException((Exception)e.ExceptionObject);
}
}
但这不起作用。永远不会调用CurrentDomain_UnhandledException
。不幸的是,我无法改变应用程序的结构,这意味着我无法使用任务并行库。我无法弄清楚为什么这不起作用。有没有其他方法来处理线程中抛出的异常?任何帮助表示赞赏。
答案 0 :(得分:3)
你的方法是正确的。但是,您将无法阻止您的申请终止。
当您在应用程序CurrentDomain_UnhandledException
中创建的线程上抛出未处理的异常时,将调用该异常,允许您记录或报告异常。但是,除非e.IsTerminating
为false
,否则您将无法停止申请终止。您可以在Exceptions in Managed Threads中了解有关此行为的更多信息。
如果您发现永远不会调用CurrentDomain_UnhandledException
,则应验证是否已调用Application_Startup
来设置处理程序。
如果您仍然遇到问题,则应验证Utilities.DisplayUnhandledException
是否不会引发异常。这也将导致您的申请立即终止。特别是,如果e.ExceptionObject
不是Exception
类型,则将其转换为Exception
将引发异常。但是,在正常情况下,当异常对象不是托管例外时,it will be wrapped in a RuntimeWrappedException
。
为避免终止应用程序,您需要在线程方法的“堆栈顶部”捕获异常。如果由于您无法访问代码而无法实现,那么未处理的异常就会显示有问题的软件,即使发现软件错误最不方便的事情就是终止应用程序以避免损坏