如何记录所有抛出的异常
本文关键字:异常 何记录 记录 | 更新日期: 2023-09-27 18:05:37
如何记录抛出和捕获的任何异常?就像Visual Studio的IntelliTrace一样。或者是否有一种方法可以将intellitrace集成到应用程序的调试版本中,然后查看其日志?
更新:我将稍微澄清一下。我想要标准的。txt(或任何自定义)日志,格式无关紧要。主要的一点是,我想记录所有第三方库中发生的所有异常,而不需要向它们添加代码。
我猜您正在搜索的功能称为FirstChanceException
,可以通过应用程序域中。FirstChanceException事件
本质上这个事件提供了一个钩子来获取关于在AppDomain
中抛出的任何(托管)异常的信息。您可以而不是以这种方式处理异常!这只是一种通知
更新:关于你对另一个答案的"吞下的例外"的评论——只是在黑暗中一枪:
在x64系统中,在windows的onLoad方法中抛出的异常不能在Main()方法中捕获。
参考本文
更新2:至于Threads
,我认为你必须自己实现它。这将涉及某种轮询,并会损害性能,但我想在大多数情况下调试它是可以的。这可以使用
var threads = Process.GetCurrentProcess().Threads;
您可以使用方面。例如,如果您使用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或企业库(我喜欢的方式做日志记录和其他一些东西)。但这不是我们真正的任务。我的意思是,任务是通过尽可能少的手工编码将日志记录注入到项目中。
尝试使用Log4Net -它是一个很棒的日志记录器,在这些场景中使用了很多http://sourceforge.net/projects/log4net/
对于处理过的异常,您很可能需要显式地记录它们。即使在语义上不是这样,处理过的异常和未处理过的异常也有很大的不同。
处理过的异常不再是异常情况。写代码的人说。我知道如何处理这个异常,然后正确地继续。
对于未处理的异常,请看Elmah你可以附加一个调试器,如WinDbg,到你的进程,并让它打破任何第一次机会CLR异常;这将包括第三方库中的异常。请看这里的一个示例:
您可以使用自己的日志系统,也可以使用名为log4net的第三方库。
除了一些人提出的Log4Net,你也可以使用NLog。我不知道这两种解决方案有什么不同,我只知道我对NLog很满意。
如果你的东西是一个web的东西,那么你可以使用https://elmah.github.io/自动记录错误(甚至不停止你的服务!)