在C#中如何收集程序崩溃的堆栈跟踪

Ahm*_*med 16 .net c# error-handling winforms

我是C#的新手.我正在编写一个基于桌面的小型应用程序,我需要在应用程序中使用此功能.

如果应用程序随时崩溃,应用程序应该有最后的机会收集堆栈跟踪并将其发回给我...

请告诉我这方面的指示.

我是否需要尝试捕获覆盖主应用程序的入口点?或者在C#应用程序中处理此类事情的最佳方法是什么.

谢谢,

Ase*_*tam 26

要捕获所有未处理的异常,请将其添加到program.cs:

    [STAThread]
    static void Main()
    {
    AppDomain currentDomain = default(AppDomain);
    currentDomain = AppDomain.CurrentDomain;
    // Handler for unhandled exceptions.
    currentDomain.UnhandledException += GlobalUnhandledExceptionHandler;
    // Handler for exceptions in threads behind forms.
    System.Windows.Forms.Application.ThreadException += GlobalThreadExceptionHandler;
    ...
    }

private static void GlobalUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = (Exception)e.ExceptionObject;
   ILog log = LogManager.GetLogger(typeof(Program));
   log.Error(ex.Message + "\n" + ex.StackTrace);
}

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
   Exception ex = default(Exception);
   ex = e.Exception;
   ILog log = LogManager.GetLogger(typeof(Program)); //Log4NET
   log.Error(ex.Message + "\n" + ex.StackTrace);
}
Run Code Online (Sandbox Code Playgroud)

您可以通过exception.StackTrace获取堆栈跟踪

  • @ user1185422 Aseem的方法是一个全局解决方案,甚至可以捕获启动时错误,.NET内部异常,异步操作错误等.Lynn的方法是本地方法,只会捕获从"MainEntryPoint"调用的方法中发生的异常**同步**.我不推荐Lynn的方法作为崩溃报告解决方案,因为你可以错过整个类的错误. (4认同)
  • 谢谢你的回答.我将你的答案与Lynn Crumbling的答案进行比较,我想知道这种方法与他的相比有什么好处? (2认同)
  • 尝试catch块是好的,但是在try-catch中包装每行代码可能很乏味,而且由于第三方库可能存在异常,这种方法也解决了这两个问题.您可以继续使用try-catch块方法,即使这样也是绝对必要的. (2认同)