如何记录所有抛出的异常?

时间:2011-08-16 09:23:49

标签: c# .net exception-handling intellitrace

如何记录抛出和捕获的任何异常?像Visual Studio的IntelliTrace那样的东西。或者有没有办法将InteliTrace集成到应用程序的调试版本中,然后查看其日志?

更新:我会澄清一下。我想要标准的.txt(或任何自定义)日志,格式无关紧要。重点是我想记录所有第三方库中发生的所有异常,而不向它们添加代码。

8 个答案:

答案 0 :(得分:26)

我猜您要搜索的功能名为FirstChanceException,可以通过该功能访问 AppDomain.FirstChanceException Event

本质上,此事件提供了一个钩子,用于获取有关在AppDomain中抛出的任何(托管)异常的信息。 您可以以这种方式处理异常!这只是一种通知


更新: 关于你对另一个答案的“吞噬异常”的评论 - 只是一记黑暗: 在x64系统上,无法在Main()方法中捕获在Windows的onLoad方法中抛出的异常。
请参阅this SO article以供参考


更新2: 至于Threads我认为你必须自己实现它。这将涉及某种轮询并会损害性能,但我想在大多数情况下调试都没问题。 这可以使用

完成
var threads = Process.GetCurrentProcess().Threads;

答案 1 :(得分:5)

你可能会选择方面。例如,如果您使用PostSharp,并编写一个为每个函数创建try-catch的方面,则在方面完成日志记录。登录后只需重新抛出即可。

来自其网站的示例代码,以获得演示代码的完整答案:

/// <summary>
/// Aspect that, when applied on a method, catches all its exceptions,
/// assign them a GUID, log them, and replace them by an <see cref="InternalException"/>.
/// </summary>
[Serializable]
public class ExceptionPolicyAttribute : OnExceptionAspect
{
    /// <summary>
    /// Method invoked upon failure of the method to which the current
    /// aspect is applied.
    /// </summary>
    /// <param name="args">Information about the method being executed.</param>
    public override void OnException(MethodExecutionArgs args)
    {
        Guid guid = Guid.NewGuid();

        Trace.TraceError("Exception {0} handled by ExceptionPolicyAttribute: {1}",
            guid, args.Exception.ToString());

        throw new InternalException(
            string.Format("An internal exception has occurred. Use the id {0} " +
                "for further reference to this issue.", guid));
    }
}

修改

您可以使用任何记录器,如log4net,NLog或企业库(我首选的记录方式和其他一些东西)。但这不是真正的任务。任务是 - 恕我直言 - 以尽可能少的手动编码注入项目。

答案 2 :(得分:1)

尝试使用Log4Net - 它是一款出色的记录器,在这些场景中使用了很多http://sourceforge.net/projects/log4net/

答案 3 :(得分:1)

对于已处理的异常,您很可能需要明确记录它们。即使在语义上并非如此,处理和未处理的异常也会有很大差异。

处理异常不再是特殊情况。有人写代码说。我知道如何处理此异常并在之后正确进行。

对于未处理的例外情况,请查看Elmah

答案 4 :(得分:1)

您可以将调试器(如WinDbg)附加到您的进程,并使其在任何第一次机会CLR异常时中断;这将包括第三方库中的例外情况。有关如何执行此操作的示例,请参阅here

答案 5 :(得分:0)

您可以使用自己的日志系统或使用名为log4net的第三方库。

答案 6 :(得分:0)

除了某些人提出的Log4Net之外,您还可以使用NLog。我不知道这两种解决方案之间的区别,我只知道我对NLog感到满意。

答案 7 :(得分:0)

如果你的东西是网络内容,那么你可以使用https://elmah.github.io/自动记录错误(甚至不用停止你的服务!)