捕获从ShowAsync()

时间:2017-08-08 21:38:42

标签: c# uwp

目前,如果我从点击处理程序向调用堆栈的某处抛出异常,它将使应用程序崩溃。有没有办法允许异常超出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?
        }
}

2 个答案:

答案 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;
        }