Warum muss die return-Anweisung vor einer throw-Anweisung in einem catch-Block stehen

9

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?

    
sirbombay 26.09.2013, 10:21
quelle

5 Antworten

12

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:

%Vor%

(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%     
Marc Gravell 26.09.2013, 10:36
quelle
12

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)

    
Marko Topolnik 26.09.2013 10:24
quelle
1

Weil jeder Code nach der return-Anweisung innerhalb eines Codeblocks nicht erreichbar ist.

    
Juned Ahsan 26.09.2013 10:24
quelle
0

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

    
musefan 26.09.2013 10:24
quelle
0

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.

    
lpdavis13 26.09.2013 10:32
quelle

Tags und Links