我有一个WPF应用程序。
我希望应用程序有一个通用函数来捕获try-catch块中没有的所有崩溃。应用程序不应该崩溃并停止工作。相反,它应该重新启动自己再次尝试进行操作。如果事实证明应用程序真的搞砸了它就不应该进入无限循环的重启。
我尝试使用AppDomain.UnhandledExceptionHandler,它确实会引发抛出的异常,但在执行该方法后 - 程序仍然崩溃。
有办法做到这一点吗?
答案 0 :(得分:1)
这对我很有用:
Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(AppDispatcherUnhandledException);
void AppDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
string message = e.Exception.Message;
...
要重新启动WPF应用,请使用Windows.Forms
个库:
System.Windows.Forms.Application.Restart();
Application.Current.Shutdown();
答案 1 :(得分:0)
尝试:
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(AppDomain_UnhandledException);
// Catch-all exception handler
private static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
if (e.Exception != null)
{
//do somethine
}
if (e.Exception.InnerException != null)
{
//do logging?
}
//do logging?
}
// Catch-all exception handler
private static void AppDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
if (e.ExceptionObject != null)
{
if (e.ExceptionObject is Exception)
{
//do logging?
}
}
//do logging?
}
答案 2 :(得分:0)
没有办法做到这一点,而且,尝试这样做是不明智的。如果发生了未处理的Exception
,您不知道发生了什么或为什么......在这一点之后漫无目的地继续这不是一个好主意,因为您的应用可能没有互联网或数据库连接,或任何其他问题会使应用程序无法使用。
更好的解决方案是处理您认为Exception
最有可能发生的所有情况,然后只是记录(或存储在数据库中)任何Exception
发生并被AppDomain.UnhandledException
处理程序捕获。
一旦Exception
进入该处理程序之后,为避免关闭而为时已晚,但如果您记录到达该点的Exception
,那么您可以看到有哪些问题已经发生并进一步增加Exception
处理以解决这些问题。
答案 3 :(得分:0)
如果您希望在未处理的崩溃后重新启动应用程序,例如,如果它在Kiosk或类似的东西上运行,您可能希望将其包装在一个简单的shell中。
这个shell可以启动你的应用程序,在应用程序结束时检查returnvalue,并在它看起来崩溃时重新启动它。您可以计算崩溃的数量,并在多次后停止重新启动应用程序。当然,使用AppDomain.UnhandledExceptionHandler
创建未处理错误的日志,以便您修复这些错误并将代码包装在try .. catch
中。
例如:
// Start the application and wait for it to exit.
var process = Process.Start(applicationPath, commandLineArguments);
process.WaitForExit();
// If the exit code is not 0, the application closed abnormally.
if (process.ExitCode != 0)
{
// restart process
}
如果您使用此技术而不是忘记disable error reporting,那么重启过程不会被弹出对话框中断