2017-01-23 2 views
0

Ich versuche Exception Handling von einer Aufgabe zu implementieren, aber ich kann es einfach nicht richtig scheinen. Ich habe ein paar Beispiele für das Muster gefunden, aber egal, was ich versuche, es scheint immer, dass ich nicht behandelte Ausnahmen von der Aufgabe selbst bekomme. Ich muss etwas vermissen, aber ich kann nicht sehen was. Jede Hilfe würde sehr geschätzt werden.Async/Warten auf unbehandelte Exception

Ich habe ein Beispiel, das ich auf MSDN gefunden versucht, aber das ist für mich nicht funktioniert:

https://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx

Und ich folgte die Antwort auf diese Frage, aber wenn ich laufe das Update in Visual Studio es noch beschwert sich über nicht behandelte Ausnahmen:

ContinueWith TaskContinuationOptions.OnlyOnFaulted does not seem to catch an exception thrown from a started task

Dies ist der Code, den ich anfangs schrieb:

static void Main(string[] args) 
{ 
    TestAsync().ContinueWith(t => 
    { 
     Console.WriteLine(t.Exception.ToString()); 
    }, TaskContinuationOptions.OnlyOnFaulted); 

    Console.ReadKey(); 
} 

static async Task<IEnumerable<string>> TestAsync() 
{ 
    IEnumerable<string> list = null; 

    try 
    { 
     list = await TestTask(); 
    } 
    catch (Exception) 
    { 
     Console.WriteLine("Caught!"); 
    } 


    return list; 
} 

static Task<IEnumerable<string>> TestTask() 
{ 
    var task = new Task<IEnumerable<string>>(() => 
    { 
     throw new AggregateException("This is a test"); 
    }); 

    task.Start(); 

    return task; 
} 
+0

Ich bin nicht ganz klar - was erwarten Sie zu passieren? Alles, was ich sehe, ist ein Wurf, ein Fang und ein erneuter Wurf. Das würde die Ausnahme unbehandelt lassen. –

+0

Danke für die Antwort. Ich hatte gehofft, dass die Ausnahme, die in TestTask() ausgelöst wird, in der Exception-Eigenschaft der Aufgabe enden würde, die es zurückgibt, aber wenn ich dieses Beispiel in Visual Studio ausführe, markiert es den throw in TestTask() und sagt, dass es eine nicht behandelte Ausnahme ist. Ich war auch überrascht, dass das Beispiel auf MSDN dasselbe tat. –

+0

Ich habe den Beispielcode aktualisiert, damit er zeigt, was ich versucht habe, ein bisschen mehr zu machen. –

Antwort

2

Drücken Sie einfach weiter, nachdem VS unterbrochen wurde, Sie werden sehen, dass es zu Ihrem ContinueWith kommt. Es ist nur eine Eigenart des Debuggers, da es keinen try/catch in Ihrem Code finden kann, der die Ausnahme behandelt.

Wenn Sie nicht möchten, dass der Debugger stoppt und Ihnen eine Nachricht anzeigt, müssen Sie "Just My Code" in den Debugger-Optionen deaktivieren, so dass der try/catch, der in Task lebt, als die Sache gezählt wird fängt die Ausnahme ab.

+0

Wow - ist das wirklich alles? Ich habe bemerkt, dass es zu meinem ContinueWith kam, wenn ich nach der Ausnahme weitermachte, aber ich war besorgt, dass, wenn der Code in einem Release ausgeführt würde, es zur unbehandelten Ausnahme kommen würde, um es nicht weiter zu machen. –

+0

Danke für die Hilfe. Ich habe den obigen Code im Freigabemodus getestet und es funktioniert wie erwartet. Ich könnte sehen, dass dies ein bisschen mühsam ist, wenn man größere Anwendungen entwickelt und sich im Debug-Modus befindet, aber ich denke, dann wird die Option "Nur mein Code" verwendet. –