抑制未处理的异常对话框?

问题描述 投票:3回答:4

我正在处理代码中所有未处理的异常,但是每当发生一个异常时(不在调试期间),我都会得到我的错误窗口,并在错误窗口关闭后立即显示“ 您的应用程序中出现未处理的应用程序异常”窗口弹出起来如何抑制它?

PS:我没有使用ASP.NET,我正在使用Windows窗体

c# exception-handling
4个回答
4
投票

您无法隐藏AppDomain.UnhandledException。真正令人讨厌的事情发生了,程序中的线程因心脏病发作而死亡。该程序将继续以有意义的方式运行的可能性是零,.NET通过终止该程序来结束痛苦。

AppDomain.CurrentDomain.UnhandledException事件编写事件处理程序,并记录或显示e.ExceptionObject.ToString()的值,以便您了解引起事故的原因。这样可以提示您如何修复代码。如果有的话,那很可能是您无法修复的问题。例如,某种数据库服务器故障。因此,有意采取任何措施隐藏错误是一个非常糟糕的主意。您客户的支持人员将不知道该怎么办。


2
投票

对于Windows窗体,可以在调用Main()方法之前,在Application.Run()方法中添加以下内容,以将未处理的异常(否则将导致未处理的异常窗口弹出)发送到异常处理程序:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

您可以通过将以下内容添加到表单的构造函数或其他地方来使处理程序订阅未处理的异常事件:

Application.ThreadException += myHandler;

您的表单的处理程序方法将如下所示:

void myHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     //do something
}

您可以在msdn上找到有关此的更多信息。


1
投票

这里是显示all托管和非托管类型的未处理异常的解决方案:

static void Main() {
    try {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += 
            new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    }
    catch (Exception ex) {
        MessageBox.Show("A fatal error has occurred.  Please contact your admin\n" +
                        "Exception type: " + ex.GetType() + "\n" +
                        "Exception Message: " + ex.Message + "\n" +
                        ex.StackTrace, "Fatal Exception");
        if (ex.InnerException != null) {
            MessageBox.Show("Inner Exception:\n" +
                            "Exception type: " + ex.InnerException.GetType() + "\n" +
                            "Exception Message: " + ex.InnerException.Message + "\n" +
                            ex.StackTrace, "Fatal Exception (inner)");
        }
    }
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
    throw new Exception(e.Exception.Message, e.Exception);
}

为了测试这一点,我使用C ++ / CLI引发了一个非托管异常。除非存在上面的Application_ThreadException处理程序,否则将无法正确捕获它们。


0
投票

我将使用异常屏蔽。

Windows App Example

此显示服务用途

Exception Shielding

它是企业库的一部分,允许您过滤出异常并重新映射它们,以隐藏细节。

© www.soinside.com 2019 - 2024. All rights reserved.