Используйте этот фрагмент кода, например. Вы всегда должны сначала использовать самое конкретное исключение, а затем в конце использовать самое общее исключение. Или, я полагаю, я могу сказать, как вы выразились, - сначала самое производное исключение.
В этом случае первый блок catch уже перехватывает все исключения этого или супертипа ('System.Exception') ". Это и есть причина заказа для исключения.
try
{
throw new formatException();
}
catch(Exception ex)
{
<...>
}
catch(formatException ex)
{
<...>
}
Редактировать -
Если вы посмотрите на иерархию наследования класса FormatException -
System.Exception
System.SystemException
System.FormatException
и иерархия наследования класса OutOfMemoryException -
System.Exception
System.SystemException
System.OutOfMemoryException
Порядок приоритета исключений проявляется только тогда, когда у вас есть блоки catch с классами исключений, которые являются базовыми или производными классами друг друга.
Например, если у вас есть два блока catch - FormatException и Exception, вам нужно будет позаботиться о порядке блоков catch, поскольку класс FormatException наследуется от класса Exception.
Если блок перехвата Exception помещен перед блоком перехвата FormatException, то каждое исключение перехватывается блоком перехвата Exception (даже исключение формата).
Если у вас есть блок перехвата FormatException до блока перехвата Exception, то исключение формата перехватывается конкретным блоком перехвата FormatException, но все другие исключения перехватываются блоком перехвата Exception.
Но если у вас есть два блока catch, таких как FormatException и OutOfMemoryException. Тогда вам не нужно беспокоиться о порядке, так как эти два класса не являются базовыми или производными друг от друга. Таким образом, они просто конкретные исключения.
Итак, вы можете иметь либо -
try
{
throw new formatException();
}
catch(OutOfMemoryException ex)
{
<...>
}
catch(FormatException ex)
{
<...>
}
или
try
{
throw new formatException();
}
catch(FormatException ex)
{
<...>
}
catch(OutOfMemoryException ex)
{
<...>
}
Это не будет иметь значения, потому что, независимо от того, в каком порядке формируется исключение, он всегда перехватывается конкретным блоком перехвата FormatException. То же самое для OutOfMemoryException. Надеюсь, это ответит на ваш вопрос.