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

C# 抑制未处理的异常对话框?,c#,exception-handling,C#,Exception Handling,我正在处理代码中所有未处理的异常,但每当发生异常时(不是在调试期间),我都会得到错误窗口,一旦它关闭,就会弹出“未处理的应用程序异常已在您的应用程序中发生”。我如何抑制它 注:我没有使用ASP.NET,我使用的是Windows窗体,我会使用异常屏蔽 这一个显示了对服务的使用 它是Enterprise库的一部分,允许您过滤异常并重新映射它们,以隐藏详细信息。您不能禁止AppDomain.UnhandledException。发生了非常糟糕的事情,你程序中的一个线程死于心脏病发作。程序继续以有意

我正在处理代码中所有未处理的异常,但每当发生异常时(不是在调试期间),我都会得到错误窗口,一旦它关闭,就会弹出“未处理的应用程序异常已在您的应用程序中发生”。我如何抑制它


注:我没有使用ASP.NET,我使用的是Windows窗体,我会使用异常屏蔽

这一个显示了对服务的使用


它是Enterprise库的一部分,允许您过滤异常并重新映射它们,以隐藏详细信息。

您不能禁止
AppDomain.UnhandledException
。发生了非常糟糕的事情,你程序中的一个线程死于心脏病发作。程序继续以有意义的方式运行的可能性为零,.NET通过终止程序结束了痛苦


AppDomain.CurrentDomain.UnhandledException
事件编写一个事件处理程序,并记录或显示
e.ExceptionObject.ToString()
的值,这样您就可以知道是什么导致了这起事故。这将提示您如何修复代码。如果有的话,很可能是你自己无法解决的问题。例如,某种数据库服务器故障。因此,故意隐瞒错误是一个非常糟糕的想法。您的客户支持人员将不知道该做什么。

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

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
通过将以下内容添加到表单的构造函数或其他位置,可以将处理程序订阅到未处理的异常事件:

Application.ThreadException += myHandler;
表单的处理程序方法如下所示:

void myHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     //do something
}
您可以在上找到有关此问题的详细信息。

以下是一个显示所有未处理异常(托管和非托管类型)的解决方案:

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抛出了一个非托管异常。除非存在上述应用程序线程异常处理程序,否则无法正确捕获这些异常。

我认为您正在执行某种类型的win应用程序?您可以通过修复将异常抛出到顶层的代码来抑制它。