.NET”的名称;将错误报告发送给[我]”;

.NET”的名称;将错误报告发送给[我]”;,.net,exception,error-handling,error-reporting,.net,Exception,Error Handling,Error Reporting,如果异常一直传播到我的应用程序顶部(当然,这永远不会发生),我想提供一个选项,在程序崩溃之前向我发送错误报告。我想到的是将Main函数中的所有内容包装在一个try-catch中,并使用一个小类将堆栈跟踪和其他信息发送到我的服务器。这听起来很简单,但对于这样的事情,我确信我还没有充分考虑到一些障碍(如安全性、未来证明) 是否有用于此目的的现有.NET库/项目?或者,这听起来像是正确的方法吗,只需捕获应用程序入口点中的所有异常?您可以使用“发件人”在捕获和记录异常时轻松发送电子邮件。这里有一些关于如

如果异常一直传播到我的应用程序顶部(当然,这永远不会发生),我想提供一个选项,在程序崩溃之前向我发送错误报告。我想到的是将Main函数中的所有内容包装在一个try-catch中,并使用一个小类将堆栈跟踪和其他信息发送到我的服务器。这听起来很简单,但对于这样的事情,我确信我还没有充分考虑到一些障碍(如安全性、未来证明)

是否有用于此目的的现有.NET库/项目?或者,这听起来像是正确的方法吗,只需捕获应用程序入口点中的所有异常?

您可以使用“发件人”在捕获和记录异常时轻松发送电子邮件。这里有一些关于如何使用的信息。我假设您有一个Winform应用程序,但您的问题并不清楚。

请参阅.NET中所有可用的日志框架,其中任何一个都应提供电子邮件通知

<>我认为最好有一个顶级异常处理程序,它收集和记录未处理异常的数据。正如Meeh在对你的问题的评论中提到的,你的应用程序中的每个线程都需要一个


FogBugz中有一个关于错误报告功能的插件,也许这会给你更多的想法。(我想我是在他的博客上读到的,但我能找到的只是FogBugz文档中的这一页)。

使用Windows使用的相同工具:(WER)。它将进行碰撞分析,并对您的碰撞进行bucketize,以便您了解哪些是最常见的碰撞。无需更改代码,它在流程级别工作。它将记录无法捕获的异常的失败


当然,所有这些都假设您在Windows上运行。

我的标准免责声明:我是此产品的开发人员

使用我工作的公司编写的产品(运行时智能)(抢占式解决方案),您不仅可以插入错误报告,还可以通过最少的编码跟踪用户何时使用您的应用程序以及他们使用的功能

使用Dotfuscator执行代码注入(或IL编织),我们将新代码插入到您的应用程序二进制文件中,该二进制文件将使用情况数据发送回我们设施中托管的服务器(或任意其他URL)。如果您将数据发送给我们,我们将为您提供许多功能强大的分析工具和使用情况报告

此功能的基本版本将包含在Visual Studio 2010中,并且可以访问免费的数据报告门户(但没有SLA、数据保留保证或数据隐私)

将任意数据与使用信息一起发送回去的能力仅限于商业产品,但您可以联系抢先解决方案以获得功能齐全、免费时间有限的评估版本

您可以使用下面的示例代码完成错误报告:

public partial class app : Application {
// field to temporarily store exception data        
    private Exception exp;
    void AppStartup(object sender, StartupEventArgs args) {
        // add a handler to catch any unhandled exceptions    
        this.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(ErrorHandler); 
        Window1 mainWindow = new Window1();
        mainWindow.ShowDialog();
    }

    // this will prompt the user if they want to report the exception
    void ErrorHandler(object sender, DispatcherUnhandledExceptionEventArgs e) {
        this.exp = e.Exception;
        if (MessageBox.Show("A " + exp.Message + " exception happened, should I report it?", "Error Occurrend", MessageBoxButton.YesNo) == MessageBoxResult.Yes) {
            ErrorHappened();
            e.Handled = true;
        }
    }

    // this method is called by the above ErrorHandler method and when run through Dotfuscator additional code will be injected into this method that will send a usage data message back to the server and the data in the dictionary (which will be exception data) returned by the ErrorData method will be included into the message and be stored and reported on the server
    [Feature("Exception", EventType = FeatureEventTypes.Tick, ExtendedKeySourceElement = SourceElements.Method, ExtendedKeySourceName = "ErrorData")]
    private void ErrorHappened() {
        // This is here as a placeholder for the exception feature attribute which will exit the application when executed
        AppShutdown(true);
    }

    // this method takes the exception data from the exp field and returns it as a dictionary of name/value pairs
    public Dictionary<string, string> ErrorData() {
        var retval = new Dictionary<string,string>();
        if (null != exp) {
            retval.Add("Error Message",exp.Message);
            retval.Add("Stack Trace",exp.StackTrace);
        }
        return retval;
    }
}
公共部分类应用程序:应用程序{
//临时存储异常数据的字段
私人例外;
void AppStartup(对象发送器、StartupEventArgs args args){
//添加处理程序以捕获任何未处理的异常
this.DispatcherUnandledException+=新的DispatcherUnandledExceptionEventHandler(ErrorHandler);
Window1 mainWindow=新的Window1();
mainWindow.ShowDialog();
}
//这将提示用户是否要报告异常
无效错误处理程序(对象发送方、DispatcherUnhandledExceptionEventArgs e){
this.exp=e.异常;
如果(MessageBox.Show(“发生了一个“+exp.Message+”异常,我应该报告它吗?”,“错误发生报告”,MessageBoxButton.YesNo)==MessageBoxResult.Yes){
错误发生();
e、 已处理=正确;
}
}
//此方法由上述ErrorHandler方法调用,当通过Dotfuscator运行时,将向此方法中注入额外的代码,该代码将向服务器和字典中的数据(将是异常数据)发送使用情况数据消息ErrorData方法返回的数据将包含在消息中,并在服务器上存储和报告
[功能(“异常”,EventType=FeatureEventTypes.Tick,ExtendedKeySourceElement=SourceElements.Method,ExtendedKeySourceName=“ErrorData”)]
私有无效错误发生(){
//这是异常功能属性的占位符,执行时将退出应用程序
AppShutdown(真);
}
//此方法从exp字段获取异常数据,并将其作为名称/值对字典返回
公共字典ErrorData(){
var retval=新字典();
if(null!=exp){
添加(“错误消息”,exp.Message);
添加(“堆栈跟踪”,exp.StackTrace);
}
返回返回;
}
}

我修改了Jeff的,并将其更新为.NET 2.0/3.5,我很幸运。如果异常导致整个堆栈未经处理,则会截图并通过电子邮件将详细堆栈跟踪发送给开发团队。

如果您正在使用ASP.NET应用程序,也可以使用ASP.NET运行状况监视功能。涉及到在配置文件中添加几行,您将退出。

我从事的是一个开源项目,除了有客户机库的项目外,它可以做到这一点!我们捕获所有未处理的异常并将它们发送到RESTAPI,然后实时处理它们


捕获其他线程抛出的异常仍然有问题:)而且还有不可捕获的异常;i、 e.StackOverflowException;)“如果异常一直传播到我的应用程序的顶部(当然,这永远不会发生)……您忘记添加笑脸来告诉我们您是在开玩笑。”可以毫不夸张地说,所有应用程序都会崩溃。威廉,StackOverflowException很容易被发现。它只是没有堆栈跟踪。看到这个了吗