2012-05-29 3 views
2

비동기 CTP에 문제가있어 예외 처리 방법이 무엇인지 알아 내려고합니다. 아래 코드는 내 프로그램이 충돌 할 때까지 await이 호출 된 컨텍스트에서 예외를 catch하고 다시 throw해야하므로 Not caught! 블록이 예외를 catch해야합니다. 어떤 도움이나 제안에 대한TaskEx.Run의 작업에 의해 throw 된 예외를 catch하지 않습니다.

try { 
    await TaskEx.Run(() => { 
    throw new Exception(); 
    }); 
} catch { 
    // Not caught! 
} 

감사합니다. 베타 사용하여 나에게

답변

3

작품 미세 (오히려 CTP 이상은, 따라서 TaskExTask되고) :

using System; 
using System.Threading.Tasks; 

class Test 
{ 
    static void Main() 
    { 
     Task t = Foo(); 
     t.Wait(); 
    } 

    static async Task Foo() 
    { 
     try 
     { 
      await Task.Run(() => { throw new Exception(); }); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Bang! " + e); 
     } 
    } 

출력 :

같은 코드가 컴퓨터에 않는 무엇을
Bang! System.Exception: Exception of type 'System.Exception' was thrown. 
    at Test.<Foo>b__0() 
    at System.Threading.Tasks.Task`1.InnerInvoke() 
    at System.Threading.Tasks.Task.Execute() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter 
      .HandleNonSuccessAndDebuggerNotification(Task task) 
    at Test.<Foo>d__2.MoveNext() 

?

+1

허. 네가 CTP에도 적합하다고 생각해. Visual Studio 2010의 비동기 코드 디버깅 지원에 혼란 스러웠습니다. VS는 예외가 처리되지 않았 음을 알려주지 만 계속 실행하면 바깥 쪽 catch 블록이 결국 catch합니다. – Greg

+2

Sigh! VS가 예외가 처리되지 않았다고 주장하는 작업/비동기 언급에 대한 어떤 문헌도없는 이유는 무엇입니까? –

+0

이것은 나에게 너무 짜증나. VS2012에서도 여전히 동일합니다. 계속해서 실행하면 제대로 잡을 것입니다. 디버깅 만이 나를 포기합니다. 감사! – YnotDraw

0

정리의 조금 작동합니다 :

await TaskEx.Run(() => { 
    try { 
     throw new Exception(); 
    } catch { 
     // Caught! 
    } 
    }); 

편집 :

내가 때문에 나는 또한 VS11 베타를 실행 해요 사실 Jon Skeet과 같은 결과를 얻을 수 있습니다. 나는 CTP를 말할 수 없다.

+0

하지만 원래 코드도 잘 작동합니다. – svick

1

프로 팁 : Visual Studio에서 예외가 처리되지 않은 있음을을 말하고,하지만 당신은을 통해 F5 경우, 당신이 그것을 잡힐 않는 것을 볼 수있다.

(존의 답변에 대한 의견에서이 있지만, 나는 그것이 자신의 답변을받을 권리가 생각)

관련 문제