2017-08-08 5 views
0

現在、クリックハンドラからコールスタックのどこかで例外をスローすると、アプリケーションがクラッシュします。 ContentDialog.ShowAsync()の例外を許可する方法はありますか?ShowAsync()の外のContentDialogのクリックハンドラからスローされた例外をキャッチ

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? 
     } 
} 

答えて

1

OkClickedコードがloginDialog.ShowAsync()内で実行されていない、それが独立して動作します。例外を取得したい場合は、try/catchのValidateへの呼び出しをラップする必要があります。そうしないと、コンテキストに伝播し、アプリケーションがクラッシュすることはありません。

0

私は現在、WinForms/WPFアプリケーションをUWPに変換するためにいくつかの場所で以下の戦略を使用することに決めました。私は通常これをやっていないでしょうし、後でそれを取り除くこともできますが、このコードではContentDialogから例外を伝播させ、非同期/待機パターンに従います:

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; 
     } 
関連する問題