27

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

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

4

8 回答 8

31

我猜您正在搜索的功能被调用FirstChanceException并且可以通过 AppDomain.FirstChanceException 事件访问

本质上,此事件提供了一个挂钩来获取有关在AppDomain. 您不能以这种方式处理异常!这只是一种通知


更新:关于您对另一个答案的“被吞下的异常”的评论 - 并且只是进入黑暗:
在 Windows 的 onLoad 方法中引发的 x64 系统异常不能在您的 Main() 方法中捕获。
请参阅此 SO 文章以供参考


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

var threads = Process.GetCurrentProcess().Threads;
于 2011-08-16T09:40:15.953 回答
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 或企业库(我首选的记录方式和其他一些东西)。但这并不是这里真正的任务。任务是 - 恕我直言 - 以尽可能少的手动编码将日志记录注入项目。

于 2011-08-16T09:37:51.103 回答
1

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

于 2011-08-16T09:26:27.863 回答
1

对于已处理的异常,您很可能需要明确记录它们。即使在语义上不是这种情况,已处理和未处理的异常也存在巨大差异。

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

对于未处理的异常,请查看Elmah

于 2011-08-16T09:28:56.680 回答
1

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

于 2011-08-16T09:44:18.247 回答
0

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

于 2011-08-16T09:25:27.227 回答
0

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

于 2011-08-16T09:36:35.487 回答
0

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

于 2017-12-07T12:44:52.350 回答