C# 跟踪所有已处理的异常

C# 跟踪所有已处理的异常,c#,exception-handling,C#,Exception Handling,我试图理解为什么部署的应用程序不能正常工作。我已经把这个问题归咎于一个特定的更新例程。不幸的是,这个例程被嵌入了一个不做任何事情的尝试捕获中 bool requireUpdate = false; try { requireUpdate = !client.IsUpToDate(); } catch{ } 我需要一种方法来获取异常,而无需重新编译并进行部署 是否有一种方法可以修改app.config文件,以便它可以将所有处理过的异常跟踪到日志文件,而不管它们是如何处理的?这可能就是您要

我试图理解为什么部署的应用程序不能正常工作。我已经把这个问题归咎于一个特定的更新例程。不幸的是,这个例程被嵌入了一个不做任何事情的尝试捕获中

bool requireUpdate = false;
try
{
    requireUpdate = !client.IsUpToDate();
}
catch{ }
我需要一种方法来获取异常,而无需重新编译并进行部署

是否有一种方法可以修改app.config文件,以便它可以将所有处理过的异常跟踪到日志文件,而不管它们是如何处理的?

这可能就是您要查找的。
基本上,说明是使用这段代码:

System.Diagnostics.EventLog.WriteEntry(“MyEventSource”,exception.StackTrace,
系统.Diagnostics.EventLogEntryType.Warning)

此外,来自同一链接的app.config似乎如下所示:



不幸的是,对于已处理的异常,我们无能为力,因为它们已被处理(即使非常糟糕,就像您的情况一样)


获取它们的最佳方法是重写/重新编译/部署。

更新

CLR评测可以帮助你

请查看此链接:

您基本上可以跟踪您的异常:


“分析API提供了一组广泛的回调,详细描述了异常处理周期的搜索、释放和最终阶段。一个有趣的分析场景将监视托管异常,并提供其他信息,如引发异常的Win32线程、堆栈顶部的函数、该函数的参数以及异常发生时作用域中的局部变量。“

我在Java中使用的技巧:

检查应用程序中的所有catch块,寻找空块。向块中添加调试或跟踪消息,如“捕获预期异常”和异常。无论如何,您都应该这样做,并设置一个策略,即默认接受异常是绝对不可接受的


如果无法清除异常,请重新编译基本异常,在应用程序处于调试(或跟踪)模式时,向无参数构造函数添加一个块以记录堆栈跟踪。显然,如果您的应用程序/库有自己的异常继承权,那么这更容易实现,但是有一些方法可以注入这种行为(在C中实现这一点的方法与我实现这一点的方法不同)

还有另一种选择,但它可能很漂亮,也可能不漂亮:Moles

技术上用于单元测试,Moles允许您用委托替换任何.NET方法。您可能可以使用它来替换该方法,而代之以执行所需操作的委托

您可能可以用调用client.isUpdate()的委托替换原始方法,这样您就可以拦截异常了

摩尔是Pex的一部分:

使用低级调试器,例如WinDbg,您将能够知道第一次机会异常。

正是因为我今天发现了这一点(我真的很喜欢用没有太多有用答案的旧问题复活!),因为.NET4,在
AppDomain
上有一个新事件,它在任何异常处理之前触发

在应用程序的设置代码中的某个点(例如,
Program.Main
Application\u OnStart
等),您可以添加处理程序:

class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException 
            += FirstChanceException

        // ...rest of your app startup
    }

    private static bool LogFirstChanceExceptions
    {
        get  
        {
            return ConfigurationManager.AppSettings["logFirstChanceExceptions"] 
                                       .Equals(bool.TrueString)
        }
    }

    private static void FirstChanceException(object sender,
                                             FirstChanceExceptionEventArgs e)
    {
        if (e != null && 
            e.Exception != null &&
            LogFirstChanceExceptions)
        {
            Console.Error.WriteLine("First-chance {0}: {1}",
                                    e.Exception.GetType(), 
                                    e.Exception.Message);
        }
    }
}
(未测试、无担保等。未显示:如果
FirstChanceException
处理程序本身引发异常,则任何重新进入处理)


这对OP没有帮助,但它可能会帮助那些可以重新编译的人,包括一些允许他们在将来切换这种跟踪的东西。

负责编写此代码的人是一个必须接受审判的罪犯:-)我知道,我也为在代码编写时授权这些代码而感到难过。错误仍然弄乱了我的语法。这说明了如何使用跟踪,但我不认为这在这种情况下有什么帮助。如果不重新编译。。。可爱的吉普车妈妈不会撞车;你在说什么?这是吞咽,比崩溃更糟糕:-)是的,使用探查器API绝对是一种方法,但我认为,你在它上面浪费的时间最好用来重写这段垃圾代码。此外,使用CLR API还需要一些管理权限,并且在使用完应用程序后可能会使应用程序崩溃,这在生产环境中不是一个很好的做法。+1用于重写代码。今天是这个函数,明天是另一个函数。修复错误代码,这是唯一的解决方案。@Aliostad-显然您以前从未使用过探查器。很可能在每次分析会话之前/之后都必须停止应用程序,而且很可能在生产环境中它不是一个选项(安装并运行分析程序可能会对系统产生不利影响)。他想要一个不需要重新编译的解决方案。
class Program
{
    static void Main(string[] args)
    {
        AppDomain.CurrentDomain.FirstChanceException 
            += FirstChanceException

        // ...rest of your app startup
    }

    private static bool LogFirstChanceExceptions
    {
        get  
        {
            return ConfigurationManager.AppSettings["logFirstChanceExceptions"] 
                                       .Equals(bool.TrueString)
        }
    }

    private static void FirstChanceException(object sender,
                                             FirstChanceExceptionEventArgs e)
    {
        if (e != null && 
            e.Exception != null &&
            LogFirstChanceExceptions)
        {
            Console.Error.WriteLine("First-chance {0}: {1}",
                                    e.Exception.GetType(), 
                                    e.Exception.Message);
        }
    }
}