如何记录所有抛出的exception?

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

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

我猜您正在搜索的function称为FirstChanceException ,可以通过AppDomain.FirstChanceException事件访问

本质上,此事件提供了一个钩子,用于获取有关在AppDomain抛出的任何 (托管)exception的信息。 你不能这样处理exception! 这只是一种通知


更新:关于你对另一个答案的“吞噬exception”的评论 – 只是一个黑暗的镜头:
在x64系统上,在Windows的onLoad方法中抛出的exception无法在Main()方法中捕获。
看这篇SO文章供参考


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

 var threads = Process.GetCurrentProcess().Threads; 

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

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

 ///  /// Aspect that, when applied on a method, catches all its exceptions, /// assign them a GUID, log them, and replace them by an . ///  [Serializable] public class ExceptionPolicyAttribute : OnExceptionAspect { ///  /// Method invoked upon failure of the method to which the current /// aspect is applied. ///  /// Information about the method being executed. 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或企业库(我首选的记录方式和其他一些东西)。 但这不是真正的任务。 任务是 – 恕我直言 – 以尽可能少的手动编码注入项目。

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

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

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

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

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

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

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

作为一些人提出的Log4Net的替代方案,您也可以使用NLog 。 我不知道这两种解决方案之间的区别,我只知道我对NLog很满意。