目前,如果我从点击处理程序向调用堆栈的某处抛出异常,它将使应用程序崩溃。有没有办法允许异常超出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?
}
}
答案 0 :(得分:1)
OkClicked
代码不会在loginDialog.ShowAsync()
内运行,而是独立运行。如果你想从中获取异常,你必须在try / catch中包含对Validate
的调用,否则它只会传播到上下文中,并且会导致应用程序崩溃。
答案 1 :(得分:0)
我目前决定在几个地方使用以下策略来将我们的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;
}