Поиск

Улавливание множества типов исключений

В разных ситуациях вам может потребоваться блок 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. Повторю: это не обязательно, но это улучшиг совмее^имоси. с другим ходом на С#, которщй будет применять ваш пользователь.