如何记录抛出和捕获的任何异常?像Visual Studio的IntelliTrace那样的东西。或者有没有办法将InteliTrace集成到应用程序的调试版本中,然后查看其日志?
更新:我会澄清一下。我想要标准的.txt(或任何自定义)日志,格式无关紧要。重点是我想记录所有第三方库中发生的所有异常,而不向它们添加代码。
答案 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/自动记录错误(甚至不用停止你的服务!)