Kann ich Ausnahmen in C # vermeiden und die Codeausführung fortsetzen?

7

Ich habe den folgenden C # -Code. Immer wenn eine Ausnahme abgefangen wird, etwa in Zeile 1, kann ich niemals andere Zeilen (2, 3, 4 usw.) erreichen.

%Vor%

Ist es möglich, in C # zu sagen, dass, wenn Zeile 1 eine Ausnahme erzeugt, einfach weiter zu den anderen Zeilen (2, 3, 4, usw.)?

    
asel 13.10.2009, 14:53
quelle

13 Antworten

11

Sie könnten eine SkipOnError-Methode wie folgt erstellen:

%Vor%

Dann könnte man es so nennen:

%Vor%

Bearbeiten: Dies sollte es einfacher machen, eine bestimmte Ausnahme zu überspringen:

%Vor%

HINWEIS: Ich behaupte nicht, dass Sie das tun - zumindest nicht regelmäßig, da ich es selbst ziemlich hacky finde. Aber es zeigt einige der funktionalen Dinge, die wir jetzt in C # machen können, yay!

Was ich wirklich tun würde: Refactor line1 in eine Methode ( Extract Method ). Diese neue Methode sollte alle vorhersehbaren Ausnahmen behandeln (falls sie gehandhabt werden können) und somit den Anrufer in einem bekannten Zustand belassen. Weil du manchmal line1 wirklich machen willst, außer vielleicht ist es in Ordnung, wenn ein Fehler passiert ...

    
Daren Thomas 13.10.2009, 15:02
quelle
16

Ausnahmen sollten nicht ignoriert werden. :)
Sie existieren und werden aus einem bestimmten Grund geworfen: Eine Ausnahmesituation ist eingetreten, eine bestimmte Bedingung ist nicht erfüllt, und ich kann nicht weiterarbeiten ...

Es ist möglich, Ausnahmen zu ignorieren, wenn Sie einen try / catch-Block um jede Codezeile legen, aber ich glaube nicht, dass Sie das wirklich tun wollen ...

    
Frederik Gheysels 13.10.2009 14:55
quelle
5

Probieren Sie einfach catch around line1

%Vor%

Frederik hat recht, obwohl du dabei wirklich vorsichtig sein musst. Es sollte von Fall zu Fall verwendet werden. Nur wenn Sie wissen, dass der Prozess fortgesetzt werden sollte, sollten Sie ihn verwenden. Andernfalls sollten Sie die Ausnahme entsprechend behandeln.

    
Josh Mein 13.10.2009 14:55
quelle
4

Wenn es Code gibt, der immer ausgeführt werden soll, selbst wenn eine Ausnahme ausgelöst wird, selbst wenn die Ausnahme nicht im catch-Block gefangen wird, oder wenn der catch-Block eine neue Exception erneut auslöst oder auslöst sollte im "finally" -Block gehen:

%Vor%     
Cylon Cat 13.10.2009 15:00
quelle
3

Sie können jede Zeile in einen try-catch-Block isolieren, der jedoch nur Codescripts erzeugt. Wenn Sie sicher sind , dass die Zeilen nach der ersten Zeile keine Ausnahmen auslösen oder unabhängig von der Ausnahme ausgeführt werden müssen und keine zusätzlichen Fehler verursachen, können Sie eine finally hinzufügen Block nach dem ersten Fang. Beispiel:

%Vor%     
John Lechowicz 13.10.2009 15:01
quelle
2

Sie können nur Zeile 1 in einen try-catch-Block umbrechen.

    
Scott M. 13.10.2009 14:54
quelle
1

Sie können immer

tun %Vor%

Aber es gibt nichts wie ein 'retry' Keyword.

    
Brian 13.10.2009 14:55
quelle
1

Wie vorgeschlagen, sollten Sie in diesem speziellen Beispiel den Befehl try catch around line1 umbrechen. Für zukünftige Notizen sollten Sie jedoch wirklich nur Bedingungen in Ihrem try catch-Block haben, die nur dann abgeschlossen werden sollen, wenn es keine Ausnahmen gibt.

    
James 13.10.2009 14:59
quelle
1

Sie können die anderen Zeilen in eine finally-Klausel einfügen, aber das wäre ziemlich hässlich, besonders wenn diese auch Ausnahmen auslösen können ...

Sie sollten die erste Ausnahme wiederherstellen und dann mit der nächsten Zeile fortfahren, indem Sie sie in eine try / catch-Anweisung einfügen.

    
Philippe 13.10.2009 15:01
quelle
1

Wie andere bereits gesagt haben, stellen Sie zuerst sicher, dass Sie die Ausnahme "ignorieren", was Sie wirklich tun möchten. Wenn es immer noch so ist und der syntaktische Overhead aller try-catch's zu hoch ist, könnten Sie es mit dem execute-around-Idom einpacken.

Ich habe momentan keine Zeit, den ganzen Code zu skizzieren - aber was Sie tun würden, ist eine Methode zu schreiben, die einen anonymen Delegaten nimmt und ihn innerhalb eines try-catch ausführt (eventuell irgendwelche Ausnahmen protokollieren oder filtern) das sind "ok"). Nennen Sie diese Methode so etwas wie tryDo. Sie könnten dann schreiben Sie etwas wie folgt:

%Vor%

Es ist immer noch ein wenig wortreich, aber dann wollen Sie dieses Zeug nicht zu einfach machen. Es ist nur genug Overhead, damit Sie sich fragen, ob es das Richtige ist: -)

    
philsquared 13.10.2009 15:34
quelle
1

Ihr werdet dazu brauchbare fortsetzbare Fortsetzungen brauchen. Die CLR und C # unterstützen das nicht und werden dies wahrscheinlich auch nie tun. : (

    
leppie 13.10.2009 16:16
quelle
0
%Vor%

nicht zu viel gedacht, obwohl

    
Daniel Pokrývka 13.10.2009 15:00
quelle
0

Wenn es möglich ist, Ihre Exception zu behandeln und fortzufahren, sollten Sie Ihre try / catch-Blöcke lokalisieren.

%Vor%

Denken Sie daran, dass Ausnahmen außergewöhnlich sind. Wenn eine Ausnahme ausgelöst wird, sollte etwas schief gelaufen sein. Sie sollten versuchen, die Ausnahmen an erster Stelle zu verhindern.

    
Will Eddins 13.10.2009 16:13
quelle