[英]How do I handle unhandled Application level exceptions in a WPF application?
[英]WPF how to handle Exceptions and continue
我最初有代碼來處理DispatcherUnhandledException
,它會記錄錯誤並將異常標記為已處理
protected override void OnStartup(StartupEventArgs e)
{
Dispatcher.UnhandledException += OnDispatcherUnhandledException;
}
...
void OnDispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
// Log Error here
e.Handled = true;
}
我試圖通過涵蓋更廣泛的未處理異常來改善這一點
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
LogUnhandledException((Exception)ex.ExceptionObject,
"AppDomain.CurrentDomain.UnhandledException");
DispatcherUnhandledException += (s, ex) =>
LogUnhandledException(ex.Exception,
"Application.Current.DispatcherUnhandledException");
TaskScheduler.UnobservedTaskException += (s, ex) =>
LogUnhandledException(ex.Exception,
"TaskScheduler.UnobservedTaskException");
}
但我無法使用此事件處理異常
private void LogUnhandledException(Exception e, string @event)
{
// Log Error here
e.Handled = true; //Doesn't work
}
我如何處理所有類型的異常,以便代碼嘗試繼續?
坦率地說,在我看來,你的整個設計都是個壞主意。 在我看來,您希望能夠通過記錄它們並讓程序繼續執行來“處理”這些異常。 但這是一種非常危險的方法,絕對不推薦。 您應該只捕獲並處理,而您知道異常提前的例外是什么和如何處理它是安全的方式。
否則就是冒着使程序處於未知狀態的風險,從而導致從(最好)有缺陷的行為到(最壞的情況)永久性地破壞用戶重要數據的狀態。
另請參閱您是否應該捕獲所有異常?
但是,假設您無論如何都要執行此操作,您將無法使用LogUnhandledException()
方法在事件args中設置Handled
屬性,因為每個事件都是不同的。 只有DispatcherUnhandledException
事件甚至具有要設置的Handled
屬性。 UnobservedTaskException
具有可以設置的Observed
屬性, AppDomain.UnhandledException
事件甚至沒有類似的屬性。
但是,您當然可以專門處理每個處理程序。 例如:
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += (s, ex) =>
LogUnhandledException((Exception)ex.ExceptionObject,
"AppDomain.CurrentDomain.UnhandledException");
DispatcherUnhandledException += (s, ex) =>
{
LogUnhandledException(ex.Exception,
"Application.Current.DispatcherUnhandledException");
ex.Handled = true;
};
TaskScheduler.UnobservedTaskException += (s, ex) =>
{
LogUnhandledException(ex.Exception,
"TaskScheduler.UnobservedTaskException");
ex.SetObserved();
};
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.