【问题标题】:Create Windows Form with Exception information on catch?创建带有异常信息的 Windows 窗体?
【发布时间】:2012-10-25 13:58:55
【问题描述】:

我正在尝试找到一种方法来创建一个漂亮的 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" );
}

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

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

非常感谢。

【问题讨论】:

    标签: c# winforms exception-handling try-catch


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      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() 是有风险的代码。

      【讨论】:

      • 您需要将异常捕获到源才能“重试”事件。我不明白您如何使用ex.StackTrace 来检索失败事件的字符串表示并重新触发该事件...
      • @MLavine 解决方案是否包含足够的解释?
      【解决方案3】:

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

      【讨论】:

      • 听起来,通过这些操作,他可能只需在单击按钮时将 DialogResult 属性设置为 Windows 窗体枚举中的值(请参阅:msdn.microsoft.com/en-us/library/…),然后在窗体出现时由 ShowDialog 返回关闭。干净一点。
      • @ColeCameron 只要他的选项直接映射到这些值之一,它就可以工作,是的。
      【解决方案4】:

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

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

      Application.ThreadException AppDomain.CurrentDomain.UnhandledException

      查看此链接了解更多信息。

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

      【讨论】:

        【解决方案5】:

        创建自定义消息框。这应该继承自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
                }
        

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

        【讨论】:

          【解决方案6】:
          猜你喜欢
          • 2017-04-24
          • 2013-06-23
          • 2019-04-01
          • 2010-10-30
          • 1970-01-01
          • 1970-01-01
          • 2016-09-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多