В разных ситуациях вам может потребоваться блок
try
для обнаружения исключений различных типов. Так, о методе может быть известно, что он передает исключения нескольких различных типов, или в одном блоке
try
вам потребуются вызовы нескольких методов, причем о каждом методе известно, что он передает исключение своего типа. Тогда для исключения каждого типа, который вы хотите обработать, добавляется блок
catch:
try {
Foo(); // Может передавать FooException.
Bar(); // Может передавать BarException. }
catch(FooException e) {
// Обработка ошибки. }
catch(BarException e) {
// Обработка ошибки. >
catch(Exception e) { >
Теперь исключение каждого типа может быть обработано в отдельном блоке
catch
(код обработки ошибки). Однако самое важное здесь то, что базовый класс обрабатывается последним. Это понятно: ведь все исключения являются производными от
System.Exception,
и если вы поместите блок
catch
для базового класса первым, до других блоков
catch
выполнение не дойдет. С учетом этого следующий код будет забракован компилятором:
try {
РоЪ(); // Может передавать FooException.
BarQ; // Может передавать BarException. }
catch(Exception e) {
// ""ОШИБКА - ЭТО КОМПИЛИРОВАТЬСЯ НЕ БУДЕТ }
catch(FooException e) {
// Обработка ошибки. }
catch(BarException e) <
// Обработка ошибки. }
//
следуют в большинстве программ на С#), называть свои классы
//
исключений, добавляя в конец слово "Exception". Например, если
//
вы хотите сделатькласс Afv/ia/icyO-opAto производным от класса
Другое эмпирическое правило: при создании собственного производного класса исключений реализовывать все четыре конструктора 5vjfem.£xcepf/on. Повторю: это не обязательно, но это улучшиг совмее^имоси. с другим ходом на С#, которщй будет применять ваш пользователь.