我想在我的代码的根目录中使用某种catch-all异常机制,因此当应用程序意外终止时,我仍然可以提供一些有用的日志记录.
有点像
static void Main () { if (Debugger.IsAttached) RunApp(); else { try { RunApp(); } catch (Exception e) { LogException(e); throw; } } }
虽然这一切都运行正常,但我的问题是当我想在引发异常后附加调试器时.
由于异常会转移到运行时,因此窗口会提示附加visual studio,但由于已经重新抛出,因此堆栈中的所有本地和参数都已丢失.
有没有记录这些异常,同时仍提供附加调试器并保留所有有用信息的方法?
解决方法
正如保罗贝茨已经提到的,你可能最好使用
AppDomain.UnhandledException事件而不是try / catch块.
在UnhandledException事件处理程序中,您可以记录/显示异常,然后提供调试选项,例如显示一个表单,其中包含要忽略,调试或退出的异常详细信息和按钮.
如果用户选择调试选项,请调用System.Diagnostics.Debugger.Break(),允许用户在仍然可用的完整调用堆栈的情况下附加他们想要的任何调试器.
显然,你可以为你知道你不会将调试器附加到的任何构建禁用此选项.
class Program { static void Main() { AppDomain.CurrentDomain.UnhandledException += ExceptionHandler; RunApp(); } static void ExceptionHandler(object sender,UnhandledExceptionEventArgs e) { Console.WriteLine(e.ExceptionObject); Console.WriteLine("Do you want to Debug?"); if (Console.ReadLine().StartsWith("y")) Debugger.Break(); } static void RunApp() { throw new Exception(); } }