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
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.
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.
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%C # hat kein solches Konzept, so dass Sie nur drei Optionen übrig haben,
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:
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.
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:
return;
verwenden können, um bei einem Fehler zu beenden. Run
verwendet. Run
keine lokale Funktion sein muss, funktioniert Beispiel 2 auch mit älteren C # -Versionen