防止未处理的异常停止应用程序

问题描述:

我有一个关于异常处理的问题。防止未处理的异常停止应用程序

为了防止 “[YourProgram]已停止工作” Windows对话框,通常我赶上甚至未处理的异常,这种方式:

在App.xaml.cs:

protected override void OnStartup(StartupEventArgs e) 
    { 
     Application.Current.DispatcherUnhandledException += ProcessDispatcherException; 
     AppDomain.CurrentDomain.UnhandledException += ProcessUnhandledException; 
     // Blah blah blah... Performs a lot of loading operations... 
     mainWindow.Show(); 
    } 

然后

private void ProcessUnhandledException(object o, UnhandledExceptionEventArgs e) 
    { 
     logException("An unhandled exception has been thrown\n"+(e.ExceptionObject as Exception).ToString(), e.ExceptionObject as Exception); 
     Application.Current.Shutdown(); 
    } 

好吧,我没有Windows对话框。现在理想情况下,我想阻止这种强制关闭场景。我在这里开发的应用程序的启动时间对于最轻的用户来说持续大约1分钟(其中大多数用户需要等待2到3分钟才能启动它,它必须加载非常大且复杂的数据参考),因此重新启动它可能会造成麻烦

我想知道关于这种情况的“最佳做法”。我正在考虑在处理程序中重新创建一个新窗口,并重新显示它,因此只有用户界面将重新初始化为启动状态,没有其他参考将被加载,保存2-3分钟。任何其他建议?

哦,当然,这是“不应该达到的极端紧急情况”,但不幸的是,这主要是由于我们依赖于其他公司管理的其他系统,而我没有任何控制或有权投诉(是的,国际公司可以吸的某个时候),并且它不尝试/开捕代码:(

谢谢!

+1

你怎么能确定只是创建一个新的窗口将工作?由于存在未处理的异常,您实际上并不知道程序其余部分的状态。这可能很好,也可能不会。只是在它上面打开一个新窗口就是在寻求麻烦。 – stijn

+0

你能展示一些try catch块无法捕捉的代码吗?我想不出任何... –

+0

阅读此: http://*.com/questions/7152354/which-exceptions-shouldnt-i-catch/7152374#7152374 –

我从你写什么假设你希望你的应用程序是关键任务,意思是说,如果发生任何事情使其失败,就需要自动重启。

完成此操作的最佳方法是创建第二个看门狗进程,该进程在失败的任何时候都会重新启动应用程序。然后,当有未处理的异常时,您可以允许您的应用程序悄悄终止自己,清理未经处理的异常处理器中的任何内容。

像这样实现看门狗的最简单方法是通过后台线程循环来实现无窗口进程(例如控制台应用程序),通过检查等待句柄是否被锁定来定期检查应用程序是否正在运行。事情是这样的:

// Declared in class 
object checkLocker = new object(); 
bool mtStopCheck = false; 

// Thread loop 
bool stopCheck = false; 
while (stopCheck == false) 
{ 
    if (wait_handle_is_unlocked) 
     restart_application(); 
    Thread.Sleep(1000); 

    lock (checkLocker) 
    { 
     stopCheck = mtStopCheck; 
    } 
} 

当你想关闭看门狗下另一个线程做到这一点:

// Stop the watchdog thread so the watchdog app can shut down 
lock (checkLocker) 
{ 
    mtStopCheck = true; 
} 

因为你会在同一终端会话中运行你并不需要一个全球性的等待在Vista/Windows 7上处理没有特权问题。

如果用户关闭了应用程序,并且不希望它再次运行,则可以向看门狗进程发送信号(例如,使用命名管道或使用第二种类型的等待句柄,当您希望看门狗挂起时您锁定挂起或关闭)该应用程序已关闭,不应重新启动。

您可以在启动文件夹或其他自动方法中启动您的看门狗,也可以让您的应用程序在第一次运行时启动它。

+1

如果你需要更具体的信息让我知道。您可能会发现这本书“Windows上的并行编程”(Addison Wellelsy,作者Joe Duffy)对于这样的努力非常有价值。他解释了如何使用所有的等待句柄和一些优秀的多线程信息。 –