【问题标题】:Give user option to send error-report on uncaught exception为用户提供发送未捕获异常错误报告的选项
【发布时间】:2014-03-03 18:03:14
【问题描述】:

我开发了一个第三方公司使用的应用程序。 由于我是一个糟糕的编码员,因此应用程序仍然存在一些导致其崩溃的错误(例如未处理的 nullpointerexception)。

这是一个在 .NET 4.5 上运行的 Windows 窗体应用程序,现在他们只是得到经典的“未处理的异常导致应用程序终止,请按详细信息了解更多信息”。

试图说服他们按下“详细信息”并将堆栈跟踪发送给我真的很有用,但他们似乎都不情愿。

是否有可能使这种行为自动化,比如向他们展示一个自定义的全局“异常捕获器”,他们只需按下一个按钮就可以通过电子邮件将其发送给我。

在“全局异常处理不好”和“为什么你的应用程序抛出空指针异常,你是一个糟糕的编码器等”之前。

BR 托马斯·阿努鲁

【问题讨论】:

    标签: c# .net winforms exception-handling


    【解决方案1】:

    我猜你得到的异常是未处理的。

    因此,您将不得不使用Application.ThreadException 事件来处理它们。因为没有 .NET 自动邮件发送和消息显示,所以您必须在此事件中实现自己的。

    请查看answer I wrote 以获得一些异常捕获策略的示例。

    【讨论】:

    • 谢谢你,我相信这就是我想要的。去看看,但将你的答案标记为正确。
    【解决方案2】:

    将整个 main() 函数包装在 try-catch 语句中。
    这样,任何未处理的异常都会回滚并在你的 catch 块中被捕获:

    static void main()
    {
        try
        {
            // the application code...
        }
        catch (Exception ex)
        {
            DialogResult result = MessageBox.Show(
            "Some error occured, please click ok to send it to the develpoer");
            if (result = OK)
                email(ex); // this is your function to send the email.
                            // useful information is also in ex.message
            // here program will exit without error!
        }
    }
    

    【讨论】:

    • 这真的可能吗,在try-block下运行一切都可以吗?
    • 你可以试试! ;) 没关系!尽管程序的任何深层中的任何逻辑错误或异常都会导致离开该位置并在catch语句中结束,因此,在catch语句完成后,程序将结束。你可以在你的函数中更多地使用它,并在你认为有必要的任何地方更深入地使用它!
    【解决方案3】:

    你可以使用 log 4 net 它是开源的日志工具,Java 开发者使用很多,这个版本是专门为 .Net http://logging.apache.org/log4net/

    【讨论】:

      【解决方案4】:

      除了@Shamim 代码之外,您还可以将 main 函数包装在 try、catch 块中,因为此处的 catch 块将跟踪在 try 块中调用的任何函数内部发生的异常。

      在 catch 块中发送邮件有时会引发有关线程中止的异常,因此 finally 将是这样做的正确位置:

      catch (Exception err)
                      {
                          mailBody = "Error: " + Convert.ToString(err.Message) + "<br /> Source: " + Convert.ToString(err.Source);
                          //Can display some message to user in an Literal Control from here.
                      }
                      finally 
                      {
                          if (!string.IsNullOrEmpty(mailBody))
                          {
                              mailObject.To.Add(mailTo);
                              mailObject.CC.Add(mailCc);
                              mailObject.Body = mailBody;
      
                              MailService(mailObject);
                          }
                      }
      

      MailService 是一种发送邮件的方法,它接受 MailObject 作为参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多