2010-11-01 56 views
7

我在想,是否可以“覆盖”或可能替换标准winforms .net异常形式?替换.net中的标准异常/错误形式

我谈论这个家伙:

alt text

是否有可能,孔程序的范围时,要重写此窗口?我的意思是automaticaly,而不必执行try/catch。

谢谢!

丹尼尔

回答

2

您应该处理:

/// <summary> 
/// Main thread error handler. 
/// </summary> 
public sealed class ExceptionHandler 
{ 
    private ExceptionHandler() 
    {} 

    /// <summary> 
    /// Handles an exception on the main thread. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="t"></param> 
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    { 
     DialogResult result = DialogResult.Cancel; 
     try 
     { 
      result = ShowThreadExceptionDialog(t.Exception); 
     } 
     catch 
     { 
      try 
      { 
       MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      finally 
      { 
       Application.Exit(); 
      } 
     } 

     // Exits the program when the user clicks Abort. 
     if (result == DialogResult.Abort) 
      Application.Exit(); 
    } 

    // Creates the error message and displays it. 
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    { 
     string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n"; 
     errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; 
     return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
    } 
} 

取自以下事件:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException 

在这些处理程序中,您可以显示您制作的自定义表单。

2

这是ThreadExceptionDialog类,它派生自Form类。从它导出来改变对话框是一个失败的原因,你不能轻易地进入嵌入式控件。您可以创建自己的Form派生类来创建自己的对话框,只需给它一个带有Exception参数的构造函数即可。为Application.ThreadException实现一个事件处理程序来显示它。

请注意对话框中的根本缺陷。它希望用户在需要点击按钮来解除对话时做出正确的选择。一般来说,关于究竟发生了什么问题的信息相当模糊。这对你来说意味着什么,对用户来说,很少有什么比'哦废话'更重要。点击继续按钮通常不是正确的做法。

为了避免用户做出这样困难的选择,请在您的Main()方法中调用Application.SetUnhandledExceptionMode(),传递ThrowException,以避免引发事件。每个未处理的异常现在都会经过AppDomain.UnhandledException。包括在工作线程中产生的那些线程,例外情况是不会产生对话框。为它编写一个事件处理程序,并显示和/或记录e.ExceptionObject.ToString()的值。您可以自行决定如何将该信息提供给您的办公桌或用户的IT人员,以便您改进产品并使其机器稳定。

0

检查this链接。

从页面:

介绍

一个让我印象深刻,当我第一次开始学习.NET是其增强的异常处理功能的东西。我的意思是这样的功能,如轻松访问抛出的异常类型,完整的堆栈跟踪和内部异常。这使得在那些刚抓到顶级System.Exception的地方仍然可以获得完整的信息。我觉得这很方便,因为如果你不需要对特定类型的异常采取特定的操作,那么对于可能抛出的每种类型的异常都有连续的catch处理程序是很繁琐的。无论如何,即使你确实捕获了特定的异常,你通常也需要捕获System.Exception来掩盖自己并防止程序崩溃。因此,我发现我最终在我的代码中捕获了System.Exception。一个典型的情况是,在Windows窗体和ASP.NET Web窗体应用程序中,所有不重要的事件处理程序最终都包含try-catch System.Exception块。

麻烦的是,这样做还是有点凌乱的代码,并没有真正似乎很正确。有没有更好的办法?