是否可以在程序执行期间记录所有抛出的异常?

时间:2012-10-16 16:26:20

标签: c#

我有C#应用程序。我可以在调试模式下编译它,如果需要,可以使用任何标志等。

经过一段时间后,它无法正常工作(显着减速,部分挂起等等)

显然出了问题。作为第一次尝试,我希望看到在程序执行期间(捕获和未捕获)在任何地方出现的所有异常的完整列表。可能吗?我知道VS中有一个选项允许我在某些例外情况下“断点”。但我不想“断点”,而是想“记录”所有发生的异常,以便我以后再分析它们。

3 个答案:

答案 0 :(得分:3)

如果您不确定可能发生的异常,请尝试在您的应用程序中使用 UnhandledException

UnhandledException事件处理从主UI线程抛出的未捕获异常。 ThreadException事件处理从非UI线程抛出的未捕获异常。

static void Main(string[] args)
{      
    AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
    //... do something ...      
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
      System.Diagnostics.Trace.WriteLine((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
      // here you can log the exception ...
}

我已使用Trace class on MSDN进行日志记录:

System.Diagnostics.Trace

这包括侦听您的Trace()方法,然后写入日志文件/输出窗口/事件日志的侦听器,框架中包含的DefaultTraceListenerTextWriterTraceListenerEventLogTraceListener。它允许您指定级别(警告,错误,信息)和类别。

答案 1 :(得分:3)

坦率地说,你不应该为此使用例外。您需要的是“检测”应用程序以记录代码中的关键活动,并带有日期时间戳,以便在出现问题后,您可以查看按时间顺序排列的日志,并查看代码无法执行的操作(以及在何处)做预期的事情,或者花费更长的时间。查看Microsoft Logging Application Blo ck或log4Net

通常,正确使用异常应限于应用程序(或模块或子例程/函数)无法成功完成其旨在提供的任何功能的情况。也应记录异常,但不应使用异常来跟踪除严重故障之外的任何事件。如果代码无法从失败中恢复,在大多数情况下,它应该只是导致应用程序停止。

事实上,大多数情况下,当出现错误并抛出异常时(除了最琐碎的问题),抛出异常时可用的信息只是诊断问题的第一步。在此之前的代码执行路径中发生的事情更常见于真正的问题......

答案 2 :(得分:0)

要回答问题,您可能需要(至少部分地)创建自己的调试器,该调试器将附加到您的进程并记录所有未处理和处理的异常。 This is probably where you want to start。此外,这是调试接口的MSDN Documentation

这可以让你完成Visual Studio在进入Debug时所做的事情 - >异常并选中该框以在抛出异常时中断。唯一的区别是,不应该停止执行,而应该能够记录有关抛出异常的位置的信息(我认为异常的类型)。你会注意到的第一件事是这非常复杂。希望mdbg示例足够接近您所需要的,您可以稍微调整一下。

我也不承认这可能不是解决您尝试解决的潜在问题的最佳方法。如果您的程序中存在未处理的异常,您可能不需要任何额外的帮助来查找它们。除非代码执行以下操作,否则它们应该冒泡到表面:

try
{
    . . . Some operation
}
catch(Exception){ } //Muddle on through - Very Bad!!!

如果问题是处理过的异常没有得到妥善处理,那么上述方法无法帮助您缩小问题的范围