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

1voto

pavanred Punkte 11077

Nehmen Sie zum Beispiel dieses Stück Code. Sie sollten immer die spezifischste Ausnahme zuerst und dann die allgemeinste Ausnahme am Ende verwenden. Oder ich glaube, ich kann sagen, wie Sie es ausdrücken - die am meisten abgeleitete Ausnahme zuerst.

In diesem Fall fängt der erste Catch-Block bereits alle Ausnahmen dieses oder eines Supertyps ('System.Exception') ab". Dies ist der Grund für die Reihenfolge der Ausnahmen.

try
{
 throw new formatException();
}

catch(Exception ex)
{
    <...>
}
catch(formatException ex)
{
    <...>
}

Bearbeiten -

Wenn Sie sich die Vererbungshierarchie der Klasse FormatException ansehen -

  System.Exception
    System.SystemException
      System.FormatException

und die Vererbungshierarchie der Klasse OutOfMemoryException ist -

  System.Exception
    System.SystemException
      System.OutOfMemoryException

Die Rangfolge der Ausnahmen kommt nur ins Spiel, wenn Sie Catch-Blöcke mit Ausnahmeklassen haben, die entweder Basis- oder abgeleitete Klassen voneinander sind.

Wenn Sie z.B. zwei Catch-Blöcke haben - FormatException und Exception - dann müssen Sie sich um die Reihenfolge der Catch-Blöcke kümmern, da die Klasse FormatException von der Klasse Exception erbt. Wenn der Exception-Catch-Block vor dem FormatException-Catch-Block platziert wird, wird jede Ausnahme durch den Exception-Catch-Block abgefangen (auch eine Format-Exception). Wenn Sie den FormatException-Catch-Block vor dem Exception-Catch-Block platzieren, wird eine Format-Exception durch den spezifischen FormatException-Catch-Block abgefangen, aber alle anderen Ausnahmen werden durch den Exception-Catch-Block abgefangen.

Aber wenn Sie zwei Catch-Blöcke wie FormatException und OutOfMemoryException haben. Dann brauchen Sie sich nicht um die Reihenfolge zu kümmern, da diese beiden Klassen nicht die Basis sind oder voneinander abgeleitet wurden. Es handelt sich also nur um spezifische Ausnahmen.

Also, Sie können entweder -

try
{
 throw new formatException();
}
catch(OutOfMemoryException ex)
{
    <...>
}
catch(FormatException ex)
{
    <...>
}

Oder

try
{
 throw new formatException();
}  
catch(FormatException ex)
{
    <...>
}
catch(OutOfMemoryException ex)
{
    <...>
}

Es würde keinen Unterschied machen, denn unabhängig von der Reihenfolge wird die FormatException immer durch den spezifischen FormatException-Catch-Block abgefangen. Dasselbe gilt für OutOfMemoryException. Ich hoffe, dies beantwortet Ihre Frage.

0voto

ShahidAzim Punkte 1396

Es funktioniert auf Hierarchie und OverflowExceptiona und FormatException sind auf verschiedenen Zweigen, und teilen nur gemeinsame Ausnahmeklasse.

0voto

Saokat Ali Punkte 1045

Der Punkt ist, dass die Unterklasse zuerst kommt und dann die Basisklasse.

0voto

Brett Punkte 1495

@Loj, Sie können sich die catch-Anweisungen konzeptionell als switch-Anweisung vorstellen (wir können eine switch-Anweisung nicht so schreiben, aber trotzdem):

switch (caughtException) 
{ 
   case (caughtException is FormatException):...;
   case (caughtException is OverflowException):...; 
   case (caughtException is Exception):...; 
   etc.  

Der erste Typ, der die "is"-Prüfung erfüllt, ist derjenige, der Ihre Ausnahme behandelt. Aus diesem Grund müssen Sie auf die Reihenfolge Ihrer Catch-Blöcke achten. Catch-Blöcke werden vom spezifischsten bis zum allgemeinsten angegeben, da dies der beste Weg ist, um sicherzustellen, dass wir uns nicht verwirrt haben.

In Ihrem Beispiel, OutOfMemoryException ist "weiter entfernt" von Exception als FormatException Dies stellt jedoch kein Problem dar, da die Prüfung caughtException is FormatException gibt false zurück, und wir gehen zur nächsten Möglichkeit über.

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