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.