跟踪所有处理的异常

时间:2010-09-23 18:30:26

标签: c# exception-handling

我试图理解部署的应用程序无法正常运行的原因。我已经将问题归结为特定的更新例程。可悲的是,这个例程被嵌入到一个无用的尝试中。

bool requireUpdate = false;
try
{
    requireUpdate = !client.IsUpToDate();
}
catch{ }

我需要一种方法来获取异常而无需重新编译并进行部署。

是否有办法修改app.config文件,以便它可以跟踪所有处理的异常到日志文件,无论它们是如何处理的?

7 个答案:

答案 0 :(得分:1)

不幸的是,处理异常没有任何办法,因为他们 处理(即使非常糟糕,如你的情况)。

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

答案 1 :(得分:1)

<强>已更新

CLR分析可以帮助你!

看看这个链接: http://msdn.microsoft.com/en-us/magazine/cc301839.aspx

您基本上可以跟踪例外情况:

“他分析API提供了一组广泛的回调,详细描述了异常处理周期的搜索,展开和最后阶段。一个有趣的分析场景将监视托管异常并提供其他信息,例如抛出的Win32线程异常,堆栈顶部的函数,该函数的参数,以及异常发生点范围内的本地化。“

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

在应用的设置代码中的某个时刻(例如Program.MainApplication_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,但它可能会帮助那些可以重新编译的人,包含一些允许他们在将来切换此类跟踪的内容。

答案 4 :(得分:0)

我在Java中使用过的技巧:

浏览应用程序中的所有catch块,查找空的块。向块添加调试或跟踪消息,例如“捕获预期的异常”和异常。无论如何你应该拥有这个,并制定一个政策,默默地吞下异常是绝对不可接受的。

如果无法清除异常,请重新编译基本异常,如果应用程序处于调试(或跟踪)模式,则向no-arg构造函数添加一个块以记录堆栈跟踪。显然,如果您的应用程序/库有自己的Exception层次结构,这样做会更容易,但是有一些方法可以注入这种行为(这里用C#执行此操作的方式与我完成此操作的方式不同)

答案 5 :(得分:0)

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

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

您可以使用调用client.IsUpToDate()的委托替换原始方法,以便您可以阻止异常吗?

Moles是Pex的一部分: http://research.microsoft.com/en-us/projects/pex/default.aspx

答案 6 :(得分:-2)

solution可能就是你要找的 基本上,该指令是使用这段代码:

  

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

另外,来自同一链接的app.config似乎是这样的: <system.diagnostics> <switches>

    <add name="MySwitch" value="Verbose" />
</switches>
<trace autoflush="true">
    <listeners>
        <add name="EventLogger"
             type="System.Diagnostics.EventLogTraceListener"
             initializeData="NameOfYourApplication" />
    </listeners>
</trace>