簡體   English   中英

捕獲從ShowAsync()外部的ContentDialog的單擊處理程序引發的異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM