获取导致程序在没有处于调试模式的情况下崩溃的异常

本文关键字:调试 模式 崩溃 情况下 异常 于调试 程序 获取 | 更新日期: 2023-09-27 18:34:56

我有一个 C# 应用程序,我想通过从桌面运行.exe来运行它。 但是,我很确定会有某种类型的错误会使程序崩溃。 有没有办法将导致程序崩溃的问题写入文本文件,以便我可以看到用户使用该程序时导致问题的原因? 我知道我可以使用调试模式来执行此操作,但我想独立运行应用程序,而不是在 VS 内部运行。

谢谢

我知道 try catch 块,我已经在使用那些可能发生问题的地方。 但我说的是泛泛而谈。 例如,如果我不确定问题会发生在哪里。 无法将此特定错误打印到文件中。

获取导致程序在没有处于调试模式的情况下崩溃的异常

您可以尝试全局 try/catch 方法,但如果后台线程上出现异常,则不会捕获它。如果您希望收到应用程序域 (msdn( 中任何未经处理的异常的通知,可以使用AppDomain.UnhandledException。在程序的其余部分执行之前,您将在 main 中注册,如下所示:

static void Main(string[] args)
{
  AppDomain.UnhandledException += WriteUnhandledExceptionToFile;
  // rest of program
}
static void WriteUnhandledExceptionToFile(object sender, UnhandledExceptionEventArgs args)
{
   // write to where ever you can get it.
   string path = Path.Combine(Environment.CurrentDirectory, "UnhandledException.txt");
   File.WriteAllText(path, args.ExceptionObject.ToString()); // will print message and full stack trace.
}

编辑

请注意,默认情况下,Windows 窗体和 WPF 捕获 UI 线程上引发的任何异常。您必须订阅 Application.ThreadException 事件 (forms( 或 Application.DispatcherUnhandledException 事件 (wpf( 才能收到这些线程上的异常通知。该代码与上述 AppDomain 事件的代码非常相似。

有一个全局异常处理程序,用于将异常详细信息写入文件。

如果将 Main 方法中的代码包装在 try{}catch{} 块中,则可以在catch块中写出异常详细信息。

try
{
  // Calls to application code
}
catch(Exception ex)
{
   // log `ex.ToString()`
   throw; // rethrow to ensure termination optionally: `Application.Exit`
}

即使您没有记录问题,通常也可以从窗口中的事件查看器中获取有问题的错误。

首先要看的是 C# 中的try/catch构造。 这可能是处理错误的第一个构建块。

至于如何处理错误,这完全取决于您。 目前,您唯一声明的目标是将它们记录到文件中。 您可以从捕获的Exception对象中获取大量详细信息,并且可以将这些详细信息写入文件。 此外,您可以使用日志记录库来帮助解决此类问题。

正确的错误处理确实是一个大主题。 要记住的一件事是逻辑上您想要捕获异常的位置。 理想情况下,您希望在可以处理它的地方捕获它。 也就是说,您的代码可以从错误中充分恢复。 如果这是一个致命错误并且应用程序应该完全停止,那么您可以将异常throw堆栈的上游,并让它不被处理(尽管仍然记录在您捕获它的位置(。

但是,如果您处于可以记录错误并继续前进的逻辑状态,那么catch块允许您这样做。 记录详细信息,更新需要更新的任何对象/数据的状态,并继续应用程序的流程。

你可以用 try catch 块包围你的一个起始方法。

try
{
   ///Your code
}
catch(Exception exception)
{
   System.IO.File.WriteAllLines("ErrLog.txt", exception.Message);
}

作为永久解决方案,您可以创建扩展方法 ToLog 并随时使用它。

public static void ToLog(this Exception Exception)
{
        using (var file = File.AppendText("ErrorLog.txt"))
        {
           file.WriteLine(DateTime.Now + " : " + exception.Message);
        }
}

你可以像这样在捕获块中使用它

 catch(Exception exception)
 {
    exception.ToLog();
 }

在此处查看初始信息 http://www.csharp-examples.net/catching-unhandled-exceptions/

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
}

UnhandledException 事件处理从主 UI 线程引发的未捕获的异常。事件处理从非 UI 线程引发的未捕获的异常。

我会用一些实际的日志记录(log4net或其他(替换MessageBox。 这将使您能够将错误注销到分布式应用程序的另一台服务器,本地用户的文件系统,事件日志,如果您愿意投入时间,选项是相当无限的。