取消未处理的异常对话框?

时间:2010-04-04 16:33:24

标签: c# exception-handling

我正在处理代码中的所有无法处理的异常,但每当发生一次(不是在调试期间)时,我会收到错误窗口并且一旦关闭“应用程序中出现未处理的应用程序异常“窗口弹出。我如何压制它?

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

4 个答案:

答案 0 :(得分:4)

您无法抑制AppDomain.UnhandledException。发生了一些非常令人讨厌的事情,你的程序中的一个线程死于心脏病发作。程序将以有意义的方式继续运行的几率为零,.NET通过终止程序结束了痛苦。

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

答案 1 :(得分:1)

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

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

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

Application.ThreadException += myHandler;

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

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

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

答案 2 :(得分:0)

我会使用异常屏蔽。

Windows App Example

这个用于服务

Exception Shielding

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

答案 3 :(得分:0)

这是一个显示所有未处理异常的解决方案,包括托管和非托管类型:

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处理程序,否则这些将无法正确捕获。