我在C#中有一个应用程序,我想通过从桌面运行.exe来运行它。但是,我很确定会有一些类型的错误会导致程序崩溃。有没有办法写出导致程序崩溃到文本文件的问题,以便我可以看到在用户使用该程序时导致问题的原因?我知道我可以使用调试模式来执行此操作,但我想将应用程序作为独立运行而不是在VS内。
谢谢,
我知道try catch块,我已经在使用可能出现问题的那些块。但我总的来说。例如,如果我不确定问题会在哪里发生。无法将此特定错误打印到文件中。
答案 0 :(得分:2)
您可以尝试使用全局try / catch方法,但如果后台线程上存在异常则不会被捕获。如果您希望收到appdomain(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事件(窗体)或Application.DispatcherUnhandledException事件(wpf)以通知这些线程上的异常。该代码与AppDomain事件的上述代码非常相似。
答案 1 :(得分:0)
有一个全局异常处理程序,可以将异常详细信息写入文件。
如果将Main
方法中的代码包装在try{}catch{}
块中,则可以在catch
块中写出异常详细信息。
try
{
// Calls to application code
}
catch(Exception ex)
{
// log `ex.ToString()`
throw; // rethrow to ensure termination optionally: `Application.Exit`
}
答案 2 :(得分:0)
你可以使用try catch block
包围你的一个启动方法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();
}
答案 3 :(得分:0)
即使您没有记录问题,通常也可以从Windows中的事件查看器中获取有问题的错误。
答案 4 :(得分:0)
您要关注的第一件事是the try/catch
construct in C#。这可能是您处理错误的第一个构建块。
至于你如何处理错误,这完全取决于你。目前,您唯一明确的目标是将它们记录到文件中。您可以从Exception
对象中获取大量详细信息,您可以write those details to a file。此外,您可以使用logging libraries来帮助完成此类事情。
正确的错误处理是一个很重要的主题。要记住的一件事是逻辑,其中要捕获异常。理想情况下,您希望在处理它的位置捕获它。也就是说,您的代码可以从错误中充分恢复。如果这是一个致命的错误并且应用程序应该完全停止,那么你可以在堆栈中进一步throw
异常并让它无法处理(尽管仍然记录在你捕获它的地方)。
但是,如果您处于逻辑状态,只能记录错误并继续,那么catch
块允许您这样做。记录详细信息,更新需要更新的任何对象/数据的状态,并继续执行应用程序流程。
答案 5 :(得分:0)
请在此处查看初始信息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线程抛出的未捕获异常。 ThreadException事件处理从非UI线程抛出的未捕获异常。
我会用一些实际的日志记录(log4net或其他)替换MessageBox。这将使您能够将错误注销到另一台服务器以用于分布式应用程序,本地用户的文件系统,事件日志,如果您愿意花时间,则选项是相当无限的。