应用程序不会在全局捕获的UnhandledExceptions上恢复

时间:2015-12-08 12:42:56

标签: c# wpf exception error-handling

我正在全球范围内捕捉异常,除了应用程序不会在UnhandledExceptions上恢复的部分外,它的工作正常。

我在MSDN上读到,为了允许调度程序Exception捕获未处理的非UI异常,我需要做两件事,但我不知道该怎么做。

  • 将这些异常分派给主UI线程。
  • 将它们重新放在主UI线程上,而不处理它们以允许DispatcherUnhandledException被提升。

我的代码:

public partial class App : Application
{
    public App()
    {
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    }

    private void Application_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
    {
        MessageBox.Show(e.Exception.Message, "Dispatcher Exception", MessageBoxButton.OK, MessageBoxImage.Warning);
        e.Handled = true;            
    }

    void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Exception ex = e.ExceptionObject as Exception;
        MessageBox.Show(ex.Message, "Unhandeled Exception Event", MessageBoxButton.OK, MessageBoxImage.Warning);
    }
}

3 个答案:

答案 0 :(得分:0)

唐'知道这是否有帮助,但是要调度到主UI线程,你需要调用Invoke。

e.g。如果您在主表单上,可以使用一些sudo代码。

try
{
 ... stuff
}
catch(Exception ex)
{
     this.Invoke(()=> throw ex));
}

如果您不在主表单上,那么您将需要从发生错误的位置抛出一个事件并在主表单上监听,然后在附加到侦听器的方法中执行上述操作。

答案 1 :(得分:0)

来自MSDN

  

此事件提供未捕获异常的通知。它允许   应用程序在系统之前记录有关异常的信息   默认处理程序向用户报告异常并终止   应用

(强调补充)

因此UnhandledException事件仅用于记录信息等。它不会阻止应用程序的关闭。

但是在Windows.Forms应用程序中,您可以考虑这个(相同的MSDN artice,向下滚动):

  

在使用Windows窗体的应用程序中,未处理的异常   主应用程序线程导致Application.ThreadException事件   被提高。如果处理此事件,则默认行为是   未处理的异常不会终止应用程序,尽管如此   应用程序处于未知状态。

(强调补充)。

答案 2 :(得分:0)

它对我来说很好

Array<number | string>