2016-07-19 18 views
2

未処理の例外イベントのハンドラを作成しています。これは例外をファイルにダンプし、さらに解析するためにサーバに送信します。今のところ、クラッシュが起きたことが示されます。私はそのイベントを購読した。その方法では、エラーを処理するための関数を呼び出しました。私はこの方法では、このコードを書いたときしかし、:Universal Appsの未処理例外ハンドラの非同期メソッド

public async Task HandleException(Exception exception) 
{ 
    var dialog = new MessageDialog(exception.Message, "Exception occurred"); 
    await dialog.ShowAsync(); 
} 

とデバッグモードでのVisual Studioを、それを実行するには、Visual Studioのジャストインタイムデバッガを示しています。最初は、GUIスレッドが死んでいるときにメッセージボックスを表示しようとしているのが問題だと思っていました。機能FileStorage.WriteToFileAsyncがどのように見える

public async Task HandleManagedException(Exception 
{ 
    await FileStorage.WriteToFileAsync("someFile.txt", exception.ToString()); 
} 

::私はawait FileIO.WriteTextAsync(file,data)にブレークポイントを置いたとき、デバッガモードで

public async Task WriteToFileAsync(string filename, string data) 
{ 
    var file = await this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
    await FileIO.WriteTextAsync(file, data); 
} 

が、それはそこに停止し、私はに機能を変更しました。 [続行]ボタンを押すと、前のコードと同じウィンドウが表示されます。 XAMLイベントから呼び出されたときに正しく実行されています。私は未処理の例外ハンドラで非同期メソッドのGoogleとStackOverflowを検索しましたが、私の問題に関連するものは何もありませんでした。

私の質問は次のとおりです。エラーの原因は何ですか? Unhandled例外ハンドラで非同期メソッドを使用することは可能ですか?

更新: これまでの回答はありがとうございます。 2番目の質問は、コードを詳細にデバッグした後に自分自身に答えました。これは可能であり、機能は意図したとおりに動作していることが判明しました。

+0

WriteToFileAsync( "someFile。、exception.ToString());? – BugFinder

+0

はい、私は 'FileTime.WriteTextAsync(file、data);を待つため、 –

+0

また、引用符がありません - あなたがそこに問題があるように思えます – BugFinder

答えて

3

のVisual Studioジャストインタイムデバッガーダイアログを回避するために、我々は次のようにtrueUnhandledExceptionEventArgs.Handledプロパティを設定することができます。

public App() 
{ 
    this.InitializeComponent(); 
    this.Suspending += OnSuspending; 
    this.UnhandledException += App_UnhandledException; 
} 

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    e.Handled = true; 
    await HandleException(e.Exception); 
} 

public async Task HandleException(Exception exception) 
{ 
    var dialog = new MessageDialog(exception.Message, "Exception occurred"); 
    await dialog.ShowAsync(); 
} 

をデバッグモードでは、警告やジャストインタイムデバッガーダイアログを取得しますApp.gicsで、次のコードがあるので:私たちは、プロジェクトをビルドするとき

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION 
UnhandledException += (sender, e) => 
{ 
    if (global::System.Diagnostics.Debugger.IsAttached) 
     global::System.Diagnostics.Debugger.Break(); 
}; 
#endif 

これらのコードが自動的に生成されます。これらのコードから、デバッグモデルでは未処理の例外がある場合はDebugger.Break Methodが呼び出され、警告とJust-In-Time Debuggerダイアログが表示されます。

私たちのハンドラにe.Handled = true;を設定すると、これを回避できます。詳細については、この類似の質問を確認することができます:How to try/catch all exceptions。しかし、これはデバッグモードでのみ発生します。リリースモデルでは、コードはうまくいくはずです。

+0

なぜ私たちはこれを行う必要があるのでしょうか...なぜこのデバッグはWPFのようなものではありませんか? –

+0

そのプロパティをチェックし、それが動作します。しかし、私は未処理の例外の後にアプリケーションを終了し、そのダイアログを表示しないことを好むでしょう。そのポップアップを表示しない他の方法はありますか? –

+0

@MaxiKing他の方法はありません。これらのコードは自動的に生成され、未処理例外のデバッグに役立ちます。通常、未処理の例外が発生した場合、Visual Studioはこのメソッドを壊し、例外情報フォーム 'e'パラメータを取得できます。この状況では、デバッグをやめ、この例外を処理する必要があります。私が言ったように、これはデバッグモードでのみリリースモードで発生し、Windowsランタイムは未処理例外の後にアプリケーションを終了し、ダイアログは表示されません。 –

関連する問題