[英]Catching an exception thrown from the click handler of a ContentDialog outside of ShowAsync()
當前,如果我在單擊處理程序的調用堆棧下方拋出異常,它將使應用程序崩潰。 有沒有辦法允許ContentDialog.ShowAsync()之外的異常?
public async Task<bool> ShowLoginDialogAsync(LogInType loginType) {
var loginDialog = new LoginDialog(loginType);
try {
await loginDialog.ShowAsync(); <-- Exception thrown in click handler will crash the app
}
catch { } <-- I'd like to cach login exceptions here rather than be limited the ContentDialog return result
return loginDialog.Result;
}
public sealed partial class LoginDialog {
private async void OkClicked(ContentDialog contentDialog, ContentDialogButtonClickEventArgs args) {
await Validate(); <-- last chance to catch an exception or crash?
}
}
OkClicked
代碼不在loginDialog.ShowAsync()
內部運行,而是獨立運行。 如果要從異常中獲取對Validate
的調用,則必須將其包裝在try / catch中,否則該異常將傳播到上下文,並且在未捕獲的情況下使應用程序崩潰。
我目前已決定在多個地方使用以下策略來將WinForms / WPF應用程序轉換為UWP。 我通常不會這樣做,以后可以選擇將其分解,但是這段代碼使我可以將異常傳播到ContentDialog之外,並遵循async / await模式:
public sealed partial class LoginDialog {
public Exception Exception { get; private set; }
private async void OkClicked(ContentDialog contentDialog, ContentDialogButtonClickEventArgs args) {
try {
await Validate();
}
catch (Exception e) {
Exception = e;
}
}
}
public async Task<bool> ShowLoginDialogAsync(LogInType loginType) {
var loginDialog = new LoginDialog(loginType);
await loginDialog.ShowAsync();
switch (loginDialog.Exception) {
case null:
break;
default:
throw loginDialog.Exception;
}
return loginDialog.Result;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.