3

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

谢谢,

我知道 try catch 块,并且我已经在使用那些可能出现问题的块。但我说的是一般情况。例如,如果我不确定问题会出现在哪里。无法将此特定错误打印到文件中。

4

6 回答 6

2

您可以尝试全局 try/catch 方法,但如果后台线程出现异常,则不会被捕获。AppDomain.UnhandledException如果您想在 appdomain ( msdn )中收到任何未处理异常的通知,则可以使用。在程序的其余部分执行之前,您将在 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 事件(表单)或 Application.DispatcherUnhandledException 事件(wpf)才能收到有关这些线程异常的通知。该代码与上面的 AppDomain 事件代码非常相似。

于 2012-05-21T20:40:40.090 回答
0

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

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

try
{
  // Calls to application code
}
catch(Exception ex)
{
   // log `ex.ToString()`
   throw; // rethrow to ensure termination optionally: `Application.Exit`
}
于 2012-05-21T20:26:47.473 回答
0

你可以用 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 块中使用它

 catch(Exception exception)
 {
    exception.ToLog();
 }
于 2012-05-21T20:27:06.300 回答
0

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

于 2012-05-21T20:27:10.123 回答
0

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

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

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

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

于 2012-05-21T20:28:51.243 回答
0

在此处查看初始信息http://www.csharp-examples.net/ catch-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 线程抛出的未捕获异常。ThreadException 事件处理从非 UI 线程抛出的未捕获异常。

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

于 2012-05-21T20:34:11.410 回答