2016-04-26 15 views
2

私は、非同期/待機プログラミングと例外処理にもっと精通しています。非同期メソッドで例外をキャッチする

static void Main(string[] args) 
{ 
    TestAsyncException(); 
} 

private static async void TestAsyncException() 
{ 
    try 
    { 
     var result = await Task.Factory.StartNew(() => DoSomething()); 
     //do something with the result 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
    } 
} 

private static int DoSomething() 
{ 
    throw new Exception("Exception was thrown!"); 
} 

私は期待していExceptionは正常に処理されるが、代わりに、コードの実行が停止し、私はタイプの例外「のSystem.Exception」の中に発生した

を取得..しかし で扱いませんでしたユーザーコード。

しかし、コードを実行し続けると、Exceptionが実際にキャッチされます(メッセージはConsoleに表示されます)。

コードの実行を中断することなくExceptionをキャッチする方法を教えてください。

+3

これが実際のコードであれば、それは良い例ではありません。 'TestAsyncException'は、' await'の間にコントロールを 'Main'に返します。したがって' Main'も戻り、処理は終了します。これは例外と干渉し、処理方法を予測することは難しいです。 –

+0

私はtry catchが、例外がメインスレッドにスローされるように、非同期メソッドを実行しているメインスレッドの周りにいる必要があると信じています(私は間違っているかもしれません) –

+0

多分この回答は役に立ちます: http://stackoverflow.com/questions/5383310/catch-an-exception-as-async-method –

答えて

4

まず、例外が処理されます。私はあなたが例外のためにBreak When Thrownを持っているので、コードが実行を停止し、エラーを表示していると信じています。例外ウィンドウ(Debug -> Windows -> Exception Settings)を確認してください。

のメソッドをasyncメソッドで使用すると、そのメソッドから戻ってきた情報を取得できなくなります。特定の状況を除いて、これは悪い習慣です。必ず非同期メソッドがTaskまたはTask<T>を返すがあります。

private static async Task TestAsyncException() 

今、あなたの主な方法は、タスクを聞くことができます。

static void Main(string[] args) 
{ 
    TestAsyncException().Wait(); // or whatever you want to do with the task 
    Console.Read(); 
} 

通常、あなたがここにタスクをアンラップするawaitを使用することができますが、それはですアプリケーションのエントリポイントでは許可されません。

+0

申し訳ありませんが、回答が編集されている可能性があります –

関連する問題