2 Stimmen

Was sind die meisten abgeleiteten Ausnahmen?

Ich hätte noch eine weitere Frage, auf die ich keine Antwort finden kann. Ich weiß, dass die Reihenfolge der Auffangblöcke von der am meisten abgeleiteten zur allgemeinsten ist.
Aber ich verstehe nicht, warum ich dies haben kann (warum funktioniert diese Reihenfolge? formatException ist abgeleitet von Exception so seine allgemeinere, richtig?)

catch(formatException)
//this is derived from Exception

catch(OutoFMemoryException) 
// this is derived from ArithmeticException whic is derived from Exception

2voto

Die CLR durchläuft die Catch-Blöcke in der angegebenen Reihenfolge.

Wenn eine catch-Anweisung mit einem Ausnahmetyp gefunden wird, der mit der aktuellen Ausnahme übereinstimmt, oder eine Ausnahme, die von der aktuellen Ausnahme erbt, dann wird dieser Block aufgerufen.

2voto

Smur Punkte 3005

Man muss von der spezifischsten Ausnahme zur allgemeinsten Ausnahme übergehen.

Zum Beispiel im folgenden Code:

int x = 4 / (1 - 1);

Sie erhalten eine Ausnahme des Typs DivideByZeroException, die eine ArithmeticException ist, also eine Ausnahme.

Wie würden Sie es also verwenden?

Wenn Sie wissen, dass bestimmte Arten von Fehlern auftreten können, können Sie einen speziellen Code einfügen, wenn ein solcher Fehler auftritt.

Wenn Sie wissen, dass Sie eine DivideByZeroException bekommen können, fügen Sie einen Catch-Block dafür ein und behandeln es so, wie Sie es sollten. Und Sie sollten auch einen Catch-Block für einen allgemeineren Ausnahmetyp hinzufügen:

try
{
    int x = 4 / (1 - 1);
    // More Stuff
}
catch(DivideByZeroException ex)
{
    // Here we know we got an exception on that division
}
catch(Exception ex)
{
   // Here we know something went wrong on that "more stuff"
}

Auf diese Weise können Sie Probleme leichter lösen.

1voto

Tomas Jansson Punkte 21651

Nicht notwendig, auch wenn OverflowException leitet sich ab von ArithmeticException ihr gemeinsamster Nenner ist Exception .

Sie können es als eine Art Baumstruktur sehen, in der FormatException y OverflowException befindet sich auf verschiedenen Seiten des Baumes. Wenn OverflowException geerbt von FormatException wäre die Situation anders, aber das ist nicht der Fall.

Man kann sie auch in einer anderen Reihenfolge haben, aber das hat keinen Sinn, denn wenn man eine allgemeinere Ausnahme zuerst hat, fängt sie auch alle darunter liegenden Ausnahmen ab.

1voto

amurra Punkte 14781

Es hängt auch vom Typ der ausgelösten Ausnahme ab, welcher Catch-Block aufgerufen wird. Da Sie einen Catch für FormatException definiert, dann wird, wenn a FormatException ausgelöst wird, wird es nur dann von dieser Auffangfunktion aufgefangen, wenn die Exception catch ist nicht vor ihm definiert. Wenn Sie nicht die FormatException fangen, dann eine Exception Fang würde die FormatException da es sich von Exception .

1voto

Ralf de Kleine Punkte 11038

Die try-catch-Anweisung besteht aus einem try-Block, gefolgt von einer oder mehreren catch-Klauseln, die Handler für verschiedene Ausnahmen angeben.

Wenn eine Ausnahme ausgelöst wird, sucht die Common Language Runtime (CLR) nach der catch-Anweisung, die diese Ausnahme behandelt.

Wenn die aktuell ausgeführte Methode keinen solchen Catch-Block enthält, schaut die CLR auf die Methode, die die aktuelle Methode aufgerufen hat, und so weiter auf dem Aufrufstapel.

Wenn kein Catch-Block gefunden wird, zeigt die CLR dem Benutzer eine unbehandelte Ausnahmemeldung an und hält die Ausführung des Programms an.

Oben gefunden @ msdn

Die CLR hält am ersten Catch-Block an, der puede die Ausnahme behandeln. Diejenige, die in der Liste an erster Stelle steht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X