WPF 异常处理
思路
较好的两种处理方式
1、在发生异常这一级处理
2、当很多地方出现相同的异常,统一抛到App级中,用统一的方法处理(自己写一个异常类)
全局异常处理
在App里面,处理异常,并标记为“已处理”
public App()
{
//wpf 程序异常捕获,而不崩溃退出
DispatcherUnhandledException += App_DispatcherUnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
}
private void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
{
e.SetObserved();
ExceptionHandler(e.Exception.InnerException);
}
private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
e.Handled = true;
ExceptionHandler(e.Exception);
}
private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
ExceptionHandler((Exception)e.ExceptionObject);
}
private void ExceptionHandler(Exception ex)
{
Dispatcher.Invoke(() =>
{
#if DEBUG
MessageBox.Show(string.Format("调用堆栈:\n{0}\n\n\n异常信息:\n{1}", ex.StackTrace, ex.Message));
#else
MessageBox.Show(string.Format("异常信息:\n{0}", ex.Message));
#endif
});
RecordException(ex,true);
}
private static void RecordException(Exception ex, bool isTop)
{
//这里可以用任意记录日志的工具
var logger = LogTool.GetFileLogger($"异常日志");
logger.Info($"Message:{ex.Message}");
logger.Info($"ToString:{ex.ToString()}");
logger.Info($"Source:{ex.Source}");
logger.Info($"StackTrace:{ex.StackTrace}");
if (ex.InnerException != null)
{
RecordException(ex.InnerException, false);
}
if (isTop)
{
logger.Info("\n");
logger.Info("\n");
}
}
学习技术最好的文档就是【官方文档】,没有之一。
还有学习资料【Microsoft Learn】、【CSharp Learn】、【My Note】。
如果,你认为阅读这篇博客让你有些收获,不妨点击一下右下角的【推荐】按钮。
如果,你希望更容易地发现我的新博客,不妨点击一下【关注】。