如何处理C#AppDomain.UnhandledException

时间:2013-12-26 09:54:45

标签: c# .net exception

我已经从msdn:12

阅读了这两页

所以我构建了这个简单的Web窗体应用程序:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        new Thread(new ThreadStart(throwException)).Start();           
    }

    public static void throwException()
    {
        throw new Exception();
    }

    public static void UnhandledExHandler(object sender, UnhandledExceptionEventArgs t) 
    {
        MessageBox.Show("This is exception is unhandled.");            
    }
}

static class Program
{        
    static void Main()
    {            
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(Form1.UnhandledExHandler);
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

这个问题是在执行UnhandledExHandler之后,Forms1()构造函数没有返回但是继续抛出异常,我的意思是它一直在新线程上调用throwException()。最终用户体验不断突然出现MessageBox。我知道我必须在Application.Exit()内拨打UnhandledExHandler才能退出该应用。但这不应该在调用一次之后停止调用UnhandledExHandler吗?

2 个答案:

答案 0 :(得分:1)

假设您的所有项目都在同一个应用程序域中运行,这将正常运行。 我们将这个确切的代码封装在一个在众多应用程序之间共享的公共DLL中。

另一个建议:如果在Windows窗体应用程序中使用它,您可能还想为System.Windows.Forms.Application.ThreadException添加处理程序。

例如,当有人忘记向控件事件添加异常处理时,这可以作为一个支持。

答案 1 :(得分:1)

如果您在未经调试的情况下运行应用,则会收到一个消息框,您的应用将被关闭。由于调试器工作原因,您会看到许多msg框。

您的UnhandledExceptionEventArgs.IsTerminatingtrue,我猜您无法在CurrentDomain.UnhandledException处理程序中执行任何操作。

但您可以在ThreadException事件处理程序中处理它。