2010-12-29 5 views
2

Wenn ich versuchen, fangen Blöcke, wenn eine Ausnahme ist wirft die Programmausführung wird gestoppt, nachdem der Fang behandelt wird. Aber ich muss die Programmausführung fortsetzen, selbst wenn eine Ausnahme vorliegt. Kann mir jemand helfen, wie es geht?Fortfahren Programmausführung auch nach Versuch fangen

+2

Bitte geben Sie ein Codebeispiel ein und überlegen Sie, ob Sie die Anwendung von Finally verwenden können. –

+3

Wenn Sie sagen "Ich muss das Programm fortsetzen ...", von wo genau?Aus der Anweisung, in der die Ausnahme ausgelöst wurde, oder nach dem try/catch-Block oder ...? –

Antwort

7

Wenn ich es richtig verstehe, ist hier, was Sie wollen:

try 
{ 
    Statement1(); // <-- Exception is thrown in here 
    Statement2(); // <-- You want to go here after the catch block executes 
} 
catch 
{ 
    HandleException(); 
} 

Try/Catch-Blöcke nicht so. Sie müssten Ihren Code neu zu schreiben, wie folgt statt:

try 
{ 
    Statement1(); 
} 
catch 
{ 
} 


try 
{ 
    Statement2(); 
} 
catch 
{ 
} 
3

Wenn Sie die Ausnahme behandeln und sie nicht (oder eine andere Ausnahme) von Ihrem catch Block zurückwerfen, sollte Ihr Programm fortgesetzt werden.

Zusätzlich, wenn Sie Ausnahmen von einem bestimmten Typ abfangen (sagen IO Ausnahmen), aber der Code in try Block wirft einen anderen Typ (sagen Sie eine SQL-Ausnahme), Ihre catch Block mit nicht fangen Sie es und die Ausnahme wird aufblähen, bis das Programm beendet wird.

Was genau machst du in deinen catch Blöcken?

2

Wenn Sie Funktion sprechen (nicht-Programm) können Sie schließlich Ihre Funktion

try 
{ 

} 
catch(MyException ex) 
{ 

} 
finally 
{ 
// other code to be done 
} 

weiterhin verwenden, aber wenn Sie Programmabstürze zu sagen, die cach ohne irgendein Argument kann damit umgehen.

9

Nicht abgefangene Ausnahmen beenden die Ausführung.

Wenn eine Ausnahme abgefangen und nicht erneut ausgelöst wird, wird die catch() -Klausel ausgeführt, dann die finally() -Klausel (falls es eine gibt) und die Ausführung wird mit der Anweisung nach dem try/catch/finally-Block fortgesetzt.

Wenn eine Ausnahme abgefangen und erneut ausgelöst wird, wird die catch() -Klausel bis einschließlich der throw-Anweisung ausgeführt. Die finally() - Klausel (falls es eine gibt) wird ausgeführt), dann wird die Exception geworfen (neu) und der Stack-Abbau wird fortgesetzt.

Da der Aufrufstapel abgewickelt wird, werden finally() -Klauseln ausgeführt, da sie den Gültigkeitsbereich verlassen und Dispose() wird aufgerufen, wenn Variablen deklarieren, wenn Anweisungen verwendet werden.

Was nicht passiert, ist, dass die Kontrolle nicht an dem Punkt fortgesetzt wird (und kann), an dem die ursprüngliche Ausnahme ausgelöst wurde. Es scheint, als würden Sie auf hoher Ebene Ausnahmen abfangen - wie beispielsweise Ihre Main() -Methode - und erwarten, dass die Ausführung an der ursprünglichen Fehlerstelle fortgesetzt wird.

Um dies zu erreichen, müssen Sie die Ausnahme an dem Punkt abfangen, an dem die Behandlung im Kontext sinnvoll ist, und nach dem Behandeln der Ausnahme entweder die fehlgeschlagene Operation wiederholen oder das Problem ignorieren.

Es ist ziemlich schwierig, die Ausnahmebehandlung gut zu machen; daher das Diktum, dass die beste Behandlungspraxis für Ausnahmen darin besteht, nicht damit umzugehen. Ausnahmen sollen genau das sein: außergewöhnlich. Dein Code sollte keine Ausnahme als normale Sache auslösen; noch sollten Sie Ausnahmen generell als Validierungstechnik oder als Kontrollflussoperator verwenden.

+1

Ja, tatsächlich. Trickfrage: Was ist der Unterschied zwischen den folgenden zwei Try/Catch-Blöcken? versuchen { ... } catch (Exception e) { ... } und versuchen { ... } fangen { ... } –

Verwandte Themen