我有一个 C# 应用程序,我想通过从桌面运行 .exe 来运行它。但是,我很确定会有某种类型的错误会导致程序崩溃。有没有办法将导致程序崩溃的问题写入文本文件,以便在用户使用程序时查看导致问题的原因?我知道我可以使用调试模式来执行此操作,但我想将应用程序作为独立而不是在 VS 内部运行。
谢谢,
我知道 try catch 块,并且我已经在使用那些可能出现问题的块。但我说的是一般情况。例如,如果我不确定问题会出现在哪里。无法将此特定错误打印到文件中。
我有一个 C# 应用程序,我想通过从桌面运行 .exe 来运行它。但是,我很确定会有某种类型的错误会导致程序崩溃。有没有办法将导致程序崩溃的问题写入文本文件,以便在用户使用程序时查看导致问题的原因?我知道我可以使用调试模式来执行此操作,但我想将应用程序作为独立而不是在 VS 内部运行。
谢谢,
我知道 try catch 块,并且我已经在使用那些可能出现问题的块。但我说的是一般情况。例如,如果我不确定问题会出现在哪里。无法将此特定错误打印到文件中。
您可以尝试全局 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 事件代码非常相似。
有一个将异常详细信息写入文件的全局异常处理程序。
如果将Main
方法中的代码包装在一个try{}catch{}
块中,则可以在该块中写出异常详细信息catch
。
try
{
// Calls to application code
}
catch(Exception ex)
{
// log `ex.ToString()`
throw; // rethrow to ensure termination optionally: `Application.Exit`
}
你可以用 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();
}
即使您没有记录问题,您通常也可以从 Windows 中的事件查看器中获取相关错误。
您首先要查看的是C#中的try/catch
构造。这可能是您处理错误的第一个构建块。
至于如何处理错误,这完全取决于您。目前,您唯一声明的目标是将它们记录到文件中。您可以从捕获的对象中获取很多详细信息,Exception
并且可以将这些详细信息写入文件。此外,您可以使用日志 库来帮助处理这类事情。
正确的错误处理确实是一个大课题。要记住的一件事是逻辑上你想要捕获异常的位置。理想情况下,您想在可以处理的地方抓住它。也就是说,您的代码可以从错误中充分恢复。如果这是一个致命错误并且应用程序应该完全停止,那么您可以throw
将异常进一步向上堆栈并让它不处理(尽管仍然记录在您捕获它的位置)。
但是,如果您处于可以只记录错误并继续前进的逻辑条件下,那么该catch
块允许您这样做。记录详细信息,更新任何需要更新的对象/数据的状态,并继续应用程序的流程。
在此处查看初始信息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。这将使您能够将错误注销到另一台服务器以用于分布式应用程序、本地用户的文件系统、事件日志,如果您愿意花时间的话,选项是相当无限的。