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

C# 是否可以在程序执行期间记录所有抛出的异常?,c#,C#,我有申请书。我可以在调试模式下编译它,如果需要,可以使用任何标志等 经过一段时间后,它不能正常工作(明显减速、部分挂起等) 显然出了点问题。作为第一次尝试,我希望看到在程序执行期间(捕获和未捕获)发生的所有异常的完整列表。可能吗?我知道在VS中有一个选项允许我在某些异常情况下“brekpoint”。但我不想“断点”,而是想“记录”所有发生的异常,以便以后分析它们。如果您不确定异常可能发生的位置,请尝试在应用程序中使用未处理异常 UnhandledException事件处理从主UI线程引发的未捕获

我有申请书。我可以在调试模式下编译它,如果需要,可以使用任何标志等

经过一段时间后,它不能正常工作(明显减速、部分挂起等)


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

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

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 ...
}
我使用了以下方法进行日志记录:

System.Diagnostics.Trace

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

坦率地说,您不应该为此使用异常。您需要的是“插入”应用程序,用日期时间戳记录代码中的关键活动,以便在出现问题后,您可以查看按时间顺序排列的日志,查看代码未能完成预期任务的地方,或者花费的时间比应该的长。退房,或者

一般来说,例外情况的正确使用应限于应用程序(或模块或子例程/函数)无法成功完成其设计提供的任何功能的情况。也应记录异常,但异常不应用于跟踪关键故障以外的任何故障。如果代码无法从故障中恢复,在大多数情况下,它只会导致应用程序停止


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

要回答所问的问题,您可能需要(至少部分)创建自己的调试器,该调试器将附加到您的进程并记录所有未处理和已处理的异常。另外,下面是调试接口的示例

这应该可以让您完全像VisualStudio在转到Debug->Exceptions时所做的那样,并在抛出异常时选中要打断的复选框。唯一的区别是,您不应该停止执行,而是应该能够记录有关抛出异常的位置(以及我认为异常的类型)的信息。首先你会注意到这是非常复杂的。希望mdbg示例与您需要的足够接近,您可以稍微调整它

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

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

如果问题是存在未正确处理的已处理异常,那么上述方法将无法帮助您缩小问题的范围,或者

Console.Error.WriteLine(exception.ToString())
并将标准错误重定向到文件?@Wug我应该在应用程序的每一行之后添加此字符串吗?不,只是在catch块中
exception
是捕获的异常的名称。使用断点会更好。你不想这样做有什么原因吗?@Wug我不知道断点是哪一个异常。中断所有异常也是不可能的,因为在很多情况下,异常是“合法的”。另外,应用程序在执行时不应该停止以重现问题。这并不能真正回答问题。这个答案很好,但我不建议在处理程序中显示MessageBox.Show。我不想忘记删除生产代码中的消息框。最好只写日志。这部分回答了您的问题。这将允许您记录未捕获的异常。另一点是,在捕获的异常中,您需要添加代码来记录异常。这只是一个示例代码,显然这应该用于记录并符合要求。我可以在控制台应用程序中使用它吗?创建我自己的调试器不是我要找的:)我确实需要更简单的解决方案…我同意,但是如果你想要一个更简单的解决方案,你也必须简化你的问题陈述。