C #: Entspricht dem python-try / catch / else-Block

7

In Python gibt es diesen nützlichen Ausnahmebehandlungscode:

%Vor%

Ich denke, dass es nützlich ist, den Code zu trennen, der könnte und Ausnahme von Ihrem normalen Code auslösen. In Python war dies möglich, wie oben gezeigt, aber ich kann in C # nichts Vergleichbares finden.

Unter der Annahme, dass das Feature oder ein ähnliches nicht existiert, ist es üblich, normalen Code in den try -Block oder nach dem catch -Block zu legen?

Der Grund, warum ich frage, ist, weil ich den folgenden Code habe:

%Vor%

Dies erfordert, dass sich der normale Code im try-Block befindet, da andernfalls, wenn eine Ausnahme ausgelöst und anschließend behandelt würde, newobj nicht zugewiesen wäre, aber es fühlt sich ziemlich unnatürlich an, so viel Code im try-Block zu haben, der nichts damit zu tun hat der Code%. Was zu tun ist?

Danke

    
oloftus 03.03.2010, 23:20
quelle

10 Antworten

8

Ich würde es vorziehen, den Rest des Codes außerhalb des try / catch zu sehen, damit klar ist, woher die Ausnahme kommt, die Sie versuchen zu fangen, und dass Sie nicht versehentlich eine Ausnahme abfangen, die Sie nicht versucht haben fangen.

Ich denke, die nächste Entsprechung zu Python try / catch / else ist die Verwendung einer lokalen booleschen Variablen, um daran zu erinnern, ob eine Ausnahme ausgelöst wurde oder nicht.

%Vor%

Aber wenn Sie dies tun, würde ich fragen, warum Sie die Exception nicht vollständig wiederherstellen, so dass Sie fortfahren können, als ob es erfolgreich gewesen wäre, oder aber vollständig abbrechen, indem Sie einen Fehlercode zurücksenden oder einfach nur lassen Die Ausnahme wird an den Aufrufer weitergegeben.

    
Mark Byers 03.03.2010 23:31
quelle
6

Barbarische Lösung: Erstellen Sie eine Else-Klasse, die von Exception abgeleitet ist, werfen Sie eine Instanz davon am Ende des try-Blocks und verwenden Sie catch (Else) {...} , um mit den anderen Dingen umzugehen.

Ich fühle mich so schmutzig.

    
Daniel Newby 04.03.2010 00:30
quelle
3

Das wird vielleicht runtergeregelt, aber nicht c # (ich habe fast kein c # Wissen, also habe ich keine Ahnung, ob das funktioniert).

Was ist mit etwas wie

? %Vor%     
Roman A. Taycher 04.03.2010 00:34
quelle
2

C # hat kein solches Konzept, so dass Sie nur drei Optionen übrig haben,

  • setze den else-Code in den try.
  • Setzen Sie den else-Code außerhalb des try catch-Blocks, verwenden Sie eine lokale Variable, um Erfolg oder Misserfolg anzuzeigen, und einen if-Block um Ihren else-Code.
  • Setzen Sie den else-Code in den finally-Block, verwenden Sie eine lokale Variable, um Erfolg oder Misserfolg anzuzeigen, und einen if-Block, um anderen Code zu verwenden.
AxelEckenberger 03.03.2010 23:31
quelle
2

Erlaube mir, eine Idee von einem ähnliche StackOverflow-Frage . Sie können dies nicht direkt tun, aber Sie können eine Methode schreiben, die das von Ihnen benötigte Verhalten einkapselt. Sehen Sie sich die ursprüngliche Frage an, um zu erfahren, wie Sie die Methode implementieren können (wenn Sie mit Lambda-Ausdrücken und Func delegates nicht vertraut sind). Die Verwendung könnte wie folgt aussehen:

%Vor%     
Tomas Petricek 03.03.2010 23:49
quelle
2

Setzen Sie einfach Ihren "else" -Block vor den Catch. Dann wird es nur ausgeführt, wenn die Codeausführung diesen Punkt erreicht:

%Vor%

Da ich die Verwendung von try..catch ... nicht sehen kann, es sei denn, etwas wichtiges fehlt in der OP Beschreibung.

    
David Lively 03.03.2010 23:33
quelle
0

Sie könnten so etwas tun:

%Vor%     
Vinay Sajip 03.03.2010 23:30
quelle
0

das wäre die leere Aussage wie Treffer

%Vor%     
Henri 03.03.2010 23:31
quelle
0
%Vor%     
Ravi 10.05.2017 11:49
quelle
0

Mit C # Version 7 können Sie lokale Funktionen verwenden, um dieses Verhalten zu emulieren:

Beispiel 1:

%Vor%

Wenn Sie Lambda-Syntax bevorzugen, können Sie auch eine run-Methode

deklarieren %Vor%

muss nur einmal in Ihrem Code vorhanden sein und dann das Muster für anonyme Methoden wie folgt verwenden

Beispiel 2:

%Vor%

wo immer Sie Code in einem sicheren Kontext einschließen müssen.

Hinweise:

  • In beiden Beispielen wird ein Funktionskontext erstellt, sodass wir return; verwenden können, um bei einem Fehler zu beenden.
  • Ein ähnliches Muster wie das in Beispiel 2 verwendete Muster finden Sie in JavaScript: Selbstaufrufende anonyme Funktionen (zB verwendet JQuery diese). Da Sie in C # nicht selbstaufrufen können, wird die Hilfsmethode Run verwendet.
  • Da Run keine lokale Funktion sein muss, funktioniert Beispiel 2 auch mit älteren C # -Versionen
Matt 10.05.2017 12:00
quelle

Tags und Links