2013-02-20 5 views
6

Ich studierte this article on MSDN, sowie einige Fragen/Antworten zu SO zu diesem Thema, kann aber nicht verstehen, warum unten Code nicht funktioniert (in einer Beispielkonsole App).Wie behandelt man Ausnahmen in Aufgaben mit Debugger?

Es wird erwartet, dass AggregateException entsprechend MSDN ausgelöst wird, die eine interne Ausnahme mit hello Nachricht enthalten würde. Stattdessen wird diese Ausnahme hello nicht behandelt. Es passiert, wenn Sie in einem Debugger sind.

Wenn Sie Fortfahren drücken oder eigenständig ausführen, funktioniert es wie erwartet. Gibt es eine Möglichkeit zu vermeiden, die ganze Zeit in VS zu drücken? Schließlich wird alles, was innerhalb eines Try...Catch Blocks ist, als behandelt in einem einzigen Thread-Programmiermodell behandelt. Andernfalls könnte das Debugging ein Albtraum sein.

VB.NET

Sub Main() 
    Try 
    Task.Factory.StartNew(AddressOf TaskThatThrowsException).Wait() 
    Catch ex As AggregateException 
    Console.WriteLine(ex.ToString) 'does not get here until you hit Continue 
    End Try 
End Sub 

Private Sub TaskThatThrowsException() 
    Throw New Exception("hello") 'exception was unhandled 
End Sub 

C#

namespace ConsoleApplication1 { 
    class Program { 
    static void Main(string[] args) { 
     try { 
     Task.Factory.StartNew(TaskThatThrowsException).Wait(); 
     } 
     catch (AggregateException ex) { 
     Console.WriteLine(ex.ToString()); //never gets here     
     } 
    } 

    static void TaskThatThrowsException() { 
     throw new Exception("hello"); //exception was unhandled    
    } 
    } 
} 

Gibt es etwas offensichtlich, dass ich hier bin fehlt?

+0

Stellen Sie den Debugger auf alle Ausnahmen zu stoppen. Wo hört es auf? Es sollte in 'TaskThatThrowsException' und in' Wait' stoppen. – usr

+0

@usr: selbst jetzt stoppt es bei 'Throw New Exception (" hallo ")' line, die Überprüfung aller Geworfen macht es nicht besser. Ich möchte, dass es dabei nicht aufhört, sondern vielmehr Console.WriteLine. Andernfalls könnte das Debugging ein Albtraum sein. – Neolisk

+0

Ausnahmen von Aufgaben erscheinen nicht in StartNew, nur in .Wait(). Dim myTask = Task.Factory.StartNew (...) Versuche MyTask.Wait() Catch ... – adrianm

Antwort

2

Die Einstellung "Nur Code aktivieren" wirkt sich darauf aus. Unter Extras-> Optionen, Debugging-> Allgemein-> Just My Code aktivieren. Wenn Sie es aktiviert haben, wird die Ausnahme als unbehandelt betrachtet, wenn Ihr-Code nicht behandelt. Versuchen Sie, diese Option auszuschalten.

See: http://msdn.microsoft.com/en-us/library/dd997415.aspx

+0

+1. Es scheint also, als ob dieser Ansatz von Microsoft für diesen speziellen Fall empfohlen wird. Ich schätze, ich sollte MSDN das nächste Mal genauer lesen, denn ich bin mir sicher, dass ich schnell durch diese bestimmte Seite geschaut habe, bevor ich diese Frage gestellt habe. Danke vielmals! – Neolisk

2

Dies ist höchstwahrscheinlich, weil Sie das Visual Studio-Dialogfeld falsch verstehen.

Die Ausnahme ist "Benutzer unbehandelt", da es keinen Benutzercode gibt, der es abfängt (das Original Exception), es wird von TPL eingefangen. Wenn Sie also den Debugger fortsetzen lassen oder wenn Sie Ihre Anwendung ohne den Debugger ausführen, werden Sie das erwartete Verhalten sehen.

+0

+1. Nun, mit normalen Ausnahmen werden sie als behandelt betrachtet, wenn sie sich in einem "Try ... Catch" -Block befinden (und der Typ entspricht und nicht wieder aufgetaut wird). Wie soll ich sonst meine Anwendung debuggen? Drücken Sie in ähnlichen Fällen die ganze Zeit weiter? Gibt es eine Möglichkeit, VS diese Ausnahmen beim Debuggen nicht abfangen zu lassen? – Neolisk

+1

@Neolisk Debug-> Exceptions-> Uncheck Thrown – Marc

+0

@Marc: Thrown ist bereits überall deaktiviert. – Neolisk

Verwandte Themen