2

我正在尝试找到一种方法来创建一个漂亮的 Windows 窗体,当我遇到未处理的异常时会弹出该窗体。我目前有:

// Add the event handler for handling UI thread exceptions
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException );

// Add the event handler for handling non-UI thread exceptions
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler( CurrentDomain_UnhandledException );

static void CurrentDomain_UnhandledException( object sender, UnhandledExceptionEventArgs e )
{
    MessageBox.Show( e.ToString( ), "Unhandled Non-UI Thread Exception" );
}

static void Application_ThreadException( object sender, ThreadExceptionEventArgs e )
{
    MessageBox.Show( e.ToString( ), "Unhandled UI Thread Exception" );
}

但我正在寻找的是,在线程异常方法中,弹出一个包含错误信息的窗口窗体,以及继续/退出/重新启动任何内容。这听起来与通过谷歌搜索看起来像是在某些情况下内置的东西非常相似,但是是否有可能创建某种我可以调用的可修改/自定义的东西?

抱歉,我无意中粘贴了错误的代码部分。我目前正在使用一个消息框,但想要一个带有一些功能按钮的更强大的消息框。

谢谢一堆。

4

6 回答 6

4

弹出一个 MessageBox 怎么样?看看这里http://www.dotnetperls.com/messagebox-show

于 2012-10-25T14:00:59.813 回答
4

您的所有事件都应包含在如下代码中:

DialogResult result = DialogResult.Retry;
while (result == DialogResult.Retry) {
    try {
        DoProcess();
        break;
    }
    catch (Exception ex) {
        result = MessageBox.Show(ex.ToString(), 
                    "Error Information", 
                    MessageBoxButtons.AbortRetryIgnore,
                    MessageBoxIcon.Exclamation);
        if (result == DialogResult.Abort) throw;
    }
}

DoProcess()有风险的代码在哪里。

于 2012-10-25T14:05:00.350 回答
3

当然,只需创建任何旧表单,并ShowDialog在那时使用它来显示它。你可以在上面放任何你想要的东西。然后,您可以在其上放置各种按钮,用于“继续”、“重新启动”、“退出”等。然后,您可以在ShowDialog返回后检查表单的属性,以根据单击的按钮确定要做什么。

于 2012-10-25T14:02:51.787 回答
0

创建一个自定义窗口,当您遇到错误时会弹出该窗口。然后您可以决定是否关闭应用程序,继续或退出某个进程。

我能想到的最好方法是创建一个自定义异常,当您的应用程序中出现特定问题时您会抛出该异常。然后,您应该允许此异常冒泡并通过以下方式之一进行处理。

Application.ThreadException AppDomain.CurrentDomain.UnhandledException

检查此链接以获取更多信息。

msdn.microsoft.com/en-us/library/system.windows.forms.application.threadexception.aspx

于 2012-10-25T14:13:07.903 回答
0

创建自定义消息框。这应该继承自 From

class MyDialog : Form
    {
        //your properties like buttons and all goes here
    private Button okButton;
    private Button cancelButton;

        okButton = new Button();
        okButton.DialogResult = DialogResult.OK;
        okButton.Location = new Point(20, 260);
        okButton.Size = new Size(80, 25);
        okButton.Text = "OK";
        okButton.Click += new EventHandler(okButton_ClickCompany);
        Controls.Add(okButton);

        //same implementation for all other controls you define
    }

你的实现就像

    MyDialog myDialog = new MyDialog(); // you can constructor for using it everywhere
        if (myDialog.ShowDialog() == DialogResult.OK)
        {
             //you code goes here
        }

这是非常好的方法。您可以根据需要对其进行扩展,并通过定义多个构造函数以多种方式使用它

于 2012-10-25T14:14:41.520 回答
0

MSDN 中有一个很好的示例 http://msdn.microsoft.com/en-us/library/system.threading.threadexceptioneventargs.aspx

于 2012-10-25T14:14:53.133 回答