C# 为用户提供在未捕获异常时发送错误报告的选项

C# 为用户提供在未捕获异常时发送错误报告的选项,c#,.net,winforms,exception-handling,C#,.net,Winforms,Exception Handling,我开发了一个由第三方公司使用的应用程序。 由于我是一个糟糕的程序员,应用程序仍然存在一些导致崩溃的bug(例如未处理的nullpointerexception) 这是一个运行在.NET 4.5上的Windows窗体应用程序,现在他们得到的是经典的“未处理的异常导致应用程序终止,请按details了解更多信息” 试图说服他们按“细节”并将堆栈跟踪发送给我确实有用,但他们似乎都不愿意 有没有可能自动化这种行为,比如向他们展示一个定制的全局“异常捕捉器”,他们只需按下一个按钮就可以通过电子邮件将其发送

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

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

试图说服他们按“细节”并将堆栈跟踪发送给我确实有用,但他们似乎都不愿意

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

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


BR Tomas Anyuru

我想您遇到的异常情况没有得到处理

因此,您必须使用
Application.ThreadException
事件来处理它们。由于没有.NET自动邮件发送和消息显示功能,因此您必须在此事件中实现自己的功能


请看一看,这里有一些异常捕获策略的示例。

我想您遇到的异常没有得到处理

因此,您必须使用
Application.ThreadException
事件来处理它们。由于没有.NET自动邮件发送和消息显示功能,因此您必须在此事件中实现自己的功能

请看一看,以获得一些异常捕获策略的示例。

将整个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!
    }
}
将整个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!
    }
}

你可以使用log 4 net,它是开源日志工具,Java开发者可以使用很多,这个版本是专门为.net开发的,你可以使用log 4 net,它是开源日志工具,Java开发者可以使用很多,这个版本是专门为.net开发的,除了@Shamim代码之外,你还可以用try,catch block,因为这里的catch块将跟踪try块中调用的任何函数中发生的异常

在catch块内拍摄邮件有时会引发关于线程中止的异常,因此最终应该是这样做的正确位置:

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);
                    }
                }
catch(异常错误)
{
mailBody=“Error:”+Convert.ToString(err.Message)+“
源:”+Convert.ToString(err.Source); //可以从此处在文本控件中向用户显示一些消息。 } 最后 { 如果(!string.IsNullOrEmpty(邮件正文)) { mailObject.To.Add(mailTo); mailObject.CC.Add(mailCc); mailObject.Body=mailBody; 邮件服务(mailObject); } }

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

除了@Shamim代码,您还可以将主函数包装在try,catch块中,因为这里的catch块将跟踪try块中调用的任何函数中发生的异常

在catch块内拍摄邮件有时会引发关于线程中止的异常,因此最终应该是这样做的正确位置:

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);
                    }
                }
catch(异常错误)
{
mailBody=“Error:”+Convert.ToString(err.Message)+“
源:”+Convert.ToString(err.Source); //可以从此处在文本控件中向用户显示一些消息。 } 最后 { 如果(!string.IsNullOrEmpty(邮件正文)) { mailObject.To.Add(mailTo); mailObject.CC.Add(mailCc); mailObject.Body=mailBody; 邮件服务(mailObject); } }

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

这真的可能吗?在try块下运行所有操作都可以吗?您可以试试!)没关系!尽管程序的任何深层次中的任何逻辑错误或异常都会导致离开该位置并在catch语句中结束,因此,在catch语句完成后,程序将结束。你可以在你的函数中更多地使用它,在你觉得有必要的地方在你的程序中更深入地使用它!这真的有可能吗?在try块下运行所有操作都可以吗?您可以尝试!;)没关系!尽管程序的任何深层次中的任何逻辑错误或异常都会导致离开该位置并在catch语句中结束,因此,在catch语句完成后,程序将结束。你可以在你的函数中更多地使用它,在你觉得有必要的地方在你的程序中更深入地使用它!谢谢,我相信这就是我想要的。我要看一看,但要把你的答案标记为正确。谢谢,我相信这就是我要找的。我要看一看,但要把你的答案标记为正确。