2017-08-08 1 views
1

Wie in diesem Beispiel:Welche Ausnahme zu werfen, wenn ein Zweig theoretisch unmöglich zu erreichen sein sollte?

public MatchResult GetResult(int home, int away) 
{ 
    if (home == away) 
     return MatchResult.Draw; 
    else if (home > away) 
     return MatchResult.HomeWins; 
    else if (home < away) 
     return MatchResult.AwayWins; 

    throw new Exception("Should be impossible"); 
} 

Ich weiß, dass ich dies mit einem else für die letzte Anweisung beheben konnte, aber ich ziehe es oft explizit zu sein. Dies ist zum Beispiel eine vereinfachte Situation.

Darüber hinaus: ist der Grund, warum der Compiler not all code paths return a value wirft, weil die Situation für die Compiler zu kompliziert ist oder weil aus anderen Gründen (wie wir können in Theorie den Wert von home auf halbem Weg von nicht verwalteten Code von einem ändern anderen Thread oder etwas?)

+0

Ich kann nicht sehen, wie Compiler, dass Fehler erzeugt aus Ihrem Code, da alle Zweige einen Rückgabewert oder mindestens eine Ausnahme haben. Ihre erste Frage ist jedoch eher meinungsbezogen und wird daher geschlossen. Wie auch immer: Wie könnte ein Parameter weder gleich noch größer oder kleiner sein? Wie denkst du, ist es möglich, die Ausnahme überhaupt zu erreichen? – HimBromBeere

+0

Nach diesen Code-Analyse-Tools wie ReSharper wird wahrscheinlich Ihre Ausnahme-Code als nicht erreichbar und Sie sollten es löschen. – HimBromBeere

+0

ReSharper wird dies auch nicht erkennen, nur getestet. –

Antwort

3

Ich weiß, ich könnte dies mit einem anderen für die letzte Aussage beheben, aber ich bevorzuge es oft, explizit zu sein.

Sie können explizit bleiben, ohne dem Compiler zu sagen. Da der einzige Grund, explizit zu sein ist, menschlichen Lesern zu helfen, ein Kommentar anstelle der tatsächlichen if gibt Ihnen das Beste aus beiden Welten: Programmierer sehen die Bedingung, während Compiler nicht stören Sie mit unnötigen throw s oder return s.

if (home == away) 
    return MatchResult.Draw; 
else if (home > away) 
    return MatchResult.HomeWins; 
else // if (home < away) 
    return MatchResult.AwayWins; 

In Situationen, in denen Sie wirklich eine Ausnahme werfen müssen, weil einiger Zweig unmöglich ist, die beste Vorgehensweise zu erreichen, sind Behauptungen zu verwenden:

if (!CheckNonNegative(arg)) { 
    throw new ArgumentException(nameof(arg)); 
} 
... 
if (arg == 0) { 
    ... // Do something 
} else { 
    Debug.Assert(arg > 0, "Method has checked arg to be non-negative"); 
    ... // Do something else 
} 
+0

Würde das letzte Beispiel immer noch Kompilierungsfehler auslösen, wenn der Compiler einen Rückgabewert erwartet? –

+0

@DirkBoer Wenn Sie fragen, ob eine Assertion anstelle eines "throw" verwendet werden kann, lautet die Antwort "no", da die Assertions im Release-Modus deaktiviert sind. – dasblinkenlight

0

Ich würde argumentieren, dass (wenn eine Ausnahme geworfen werden soll - ich würde lieber den Code ändern) sollte dies eine NotSupportedException werfen. Im Allgemeinen ist dies die Ausnahme, die ausgelöst wird, wenn eine Methode aufgerufen wird, aber der aktuelle Status des Objekts den Methodenaufruf zu diesem Zeitpunkt nicht unterstützt.

Es ist nur ein kurzes Stück zu sagen, dass, wenn die Gesetze der Logik zusammengebrochen sind, Sie in einem nicht unterstützten Zustand sind und die Methode nicht abschließen können.

Verwandte Themen