替换.net中的标准异常/错误表单

时间:2010-11-01 12:54:30

标签: c# .net winforms

我在想,是否有可能“覆盖”或者可能取代标准的winforms .net异常形式??

我在谈论这个家伙:

alt text

在孔程序的范围内,是否可以覆盖此窗口?我的意思是自动,无需执行try / catch。

5 个答案:

答案 0 :(得分:2)

您可以处理System.Windows.Forms.Application.ThreadException事件以显示自定义消息。

答案 1 :(得分:2)

您应该处理以下两个事件:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException

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

答案 2 :(得分:2)

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

请注意对话框中的基本缺陷。它希望用户在需要单击按钮以关闭对话框时做出正确的选择。一般而言,关于究竟出了什么问题的相当模糊的信息。它对你来说意味着什么,对用户来说很少就是'哦废话'。单击“继续”按钮通常不是正确的做法。

要避免用户做出如此困难的选择,请在Main()方法中调用Application.SetUnhandledExceptionMode(),并传递ThrowException以便永远不会引发该事件。现在每个未处理的异常都会通过AppDomain.UnhandledException。包括在工作线程中引发的那些,生成对话框的异常。为它编写一个事件处理程序,并显示和/或记录e.ExceptionObject.ToString()的值。您需要找到一种方法将信息提供给您的桌面或用户的IT员工,这样您就可以改进产品并使他们的机器稳定。

答案 3 :(得分:0)

在webforms中,您可以在global.asax中处理Application_Error。但似乎你在谈论winforms。在那种情况下:
尝试将以下代码添加到主启动器方法中:

Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(ExceptionHandler.OnThreadException);  

并按如下方式定义ExceptionHandler类:

/// <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);
    }
}

取自:http://www.eggheadcafe.com/community/aspnet/2/27469/any-method-for-handling-error-globally-in-c.aspx

答案 4 :(得分:0)

检查this链接。

从页面:

<强>简介

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

麻烦的是,这仍然会使代码混乱,并且看起来并不是很正确。还有更好的方法吗?