Der folgende Code wird sich beschweren
%Vor%während dies nicht:
%Vor%Ich verstehe es nicht ... Ich dachte, mein csc101 sagte mir, dass return-Anweisungen immer die letzte Anweisung in einer Funktion sein sollten und dass sie die Funktion beenden und die Steuerung an den aufrufenden Code zurückgeben. Warum widerspricht das der Logik meines Professors, und warum erzeugt nur eine davon eine Warnung?
return
beendet die Methode; throw
wird auch die Methode beenden, vorausgesetzt, sie befindet sich nicht in try
. Es kann nur einmal beendet werden!
Also unabhängig von der Reihenfolge - die ersten von throw
/ return
beenden die Methode effektiv.
Als allgemeinere Rückmeldung: Wenn die Absicht ist, bei einem Fehler den Wert false zurückzugeben, brauchen Sie nur:
%Vor% Persönlich würde ich sagen, dass dies ein schlechter Code ist - er versteckt das eigentliche Problem vor dem Aufrufer, was es sehr schwer macht, zu debuggen. Es sagt uns nichts von warum es fehlgeschlagen ist. Ich würde sagen, dass der bessere Ansatz einfach darin besteht, die Ausnahmeblase zu zu lassen. In diesem Fall gibt es keinen Punkt, der true
zurückgibt, weil wir niemals false
zurückgeben würden - und es hat keinen Sinn, eine Ausnahme einzufangen, nur um sie erneut zu werfen. So wird die gesamte Methode:
(nichts anderes ist erforderlich)
Wenn Ihre Frage lautet: "Warum generiert nur eine dieser Warnungen eine Warnung?": Eine faire Frage, aber der Compiler ist nicht erforderlich , um entweder für sie zu erkennen Sie. Vielleicht sollte es es erkennen. Ich vermute, dass gmcs
dies erkennen und davor warnen würde - der Compiler in Mono ist viel eher bereit, auf Dummheit hinzuweisen.
Edit: wie erwartet, [g] mcs Ausgaben:
%Vor%für den folgenden Code - also meldet er beide Verwendungen als Warnungen:
%Vor% Sie liegen falsch: Bei beiden Beispielen wird der Compilerfehler Dead code ausgelöst, weil sowohl throw
als auch return
den Ausgangspunkt einer Methode und keinen weiteren Code markieren ist über diesen Punkt hinaus erlaubt.
Unabhängig davon, ob der Compiler dies erlaubt oder nicht, ist der Code unterhalb von throw
oder return
immer noch tot und wird niemals ausgeführt.
(HINWEIS: Diese Frage wurde ursprünglich als Java markiert und mein erster Satz bezieht sich auf die Java-Compiler-Semantik)
Weil jeder Code nach der return-Anweisung innerhalb eines Codeblocks nicht erreichbar ist.
Diese Antwort basiert auf C # und ist möglicherweise auf Java anwendbar.
In diesem Fall brauchen Sie die Anweisung return
nicht wirklich. throw
ist der letzte Schritt der Funktion.
In diesem Beispiel beenden sowohl return
als auch throw
die aktuelle Funktion. Unabhängig davon, in welcher Richtung Sie sie platzieren, wird zuerst immer verhindert, dass die Sekunde erreichbar ist.
HINWEIS : Die Ausnahme, wenn eine throw
-Anweisung die Funktion beenden würde, wäre, wenn sie in einen try
-Block gehüllt wäre. In diesem Fall würde die throw
-Funktion die Ausführung des restlichen try
-Blockcodes beenden und zum relevantesten catch
-Block - oder finally
-Block gehen, wenn ein catch
nicht anwendbar ist.
Ihr Code sollte folgendermaßen aussehen:
%Vor%Es hat jedoch wenig Sinn, den Versuch / Fang trotzdem zu machen, wenn Sie nur die Ausnahme erneut werfen.
Um nur Ihre einzige Frage zu beantworten:
Warum verunreinigt das die Logik meines Professors?
Nun, entweder ist Ihr Professor falsch, oder Sie haben sie falsch verstanden
Die "Rückkehr falsch"; im Catch-Block ist nicht erreichbar wegen der "werfen e;" kurz davor. Wenn der Code im catch-Block ausgeführt wird, ist die erste Zeile ein throw, was bedeutet, dass Sie die Exception sofort an die aufrufende Methode übergeben, und daher wird der folgende Code nicht ausgeführt.
%Vor%Ich hoffe, das hilft.
Tags und Links c# computer-science