Обратите внимание на то, что в теле конструкторов класса исключенияRangeArrayExceptionотсутствуют какие-либо операторы, но вместо этого они просто передают свои аргументы классуException,используя ключевое словоbase.Как пояснялось ранее, в тех случаях, когда производный класс исключений не дополняет функции базового класса, весь процесс создания исключений можно поручить конструкторам классаException.Ведь производный класс исключений совсем не обязательно должен чем-то дополнять функции, наследуемые от классаException.
Прежде чем переходить к дальнейшему чтению, попробуйте немного поэкспериментировать с приведенной выше программой. В частности, попробуйте закомментировать переопределение методаToString и понаблюдайте за результатами. Кроме того, попытайтесь создать исключение, используя конструктор, вызываемый по умолчанию, и посмотрите, какое сообщение при этом сформируется стандартными средствами С#.
Перехват исключений производных классов
При попытке перехватить типы исключений, относящихся как к базовым, так и к производным классам, следует особенно внимательно соблюдать порядок следования операторовcatch,поскольку перехват исключения базового класса будет совпадать с перехватом исключений любых его производных классов. Например, классExceptionявляется базовым для всех исключений, и поэтому вместе с исключением типаExceptionмогут быть перехвачены и все остальные исключения производных от него классов. Конечно, для более четкого перехвата всех исключений можно воспользоваться упоминавшейся ранее формой оператораcatchбез указания конкретного типа исключения. Но вопрос перехвата исключений производных классов становится весьма актуальным и в других ситуациях, особенно при создании собственных исключений.
Если требуется перехватывать исключения базового и производного классов, то первым по порядку должен следовать операторcatch,перехватывающий исключение производного класса. Это правило необходимо соблюдать потому, что при перехвате исключения базового класса будут также перехвачены исключения всех производных от него классов. Правда, это правило соблюдается автоматически: если первым расположить в коде операторcatch,перехватывающий исключение базового класса, то во время компиляции этого кода будет выдано сообщение об ошибке.