C#

Фильтрация исключений

Во всех примерах этой главы оператор catch использует исключение тип Exception. catch (Exception) { } Этот блок перехватит каждое исключение. На рис. 5.3 среда IDE перехватывает исключение, называющееся NullReferer.ce-Exception, — это специальный тип исключения. Когда вы используете его в блоке cat щ вы перехватываете попытку ссылки на нулевой объект. Специализация — это возможность отфильтровать типы перехватываемых исключе ний. Например, обработчик catch (NotSupportedException ex) перехватит экземпляр! только исключений NotSupportedException. Например. try { throw new NotSupportedException("There is no code"); } catch(NotSupportedException ex) { } Если код внутри блока try передаст экземпляр исключения Exception, то блок cat; не сработает, поскольку блок catch ищет исключение определенного типа. Типы исключений могут быть объединены так, чтобы обеспечить определенны возможности фильтрации. Обработчик специализированного типа исключения долже быть первым после блока try, как в этом примере. try // ... catch(NotSupportedException ex) catch (Exception ex) Объединяя разнообразные фильтры исключений, вы не должны выяснять, какой вид исключения передан. Например, без фильтрации блока catch, для перехвата ис¬ключения типа NotSupportedException, вы были бы должны написать следующий код: try { throw new NotSupportedException! "There is no code"); catch (Exception ex) { if (ex is NotSupportedException) { // ... 1 else throw ex; } } В табл. 5.1 содержится список общих типов исключений пространства имен System. Типов исключений существует намного больше, а, кроме того, вы можете создавать собственные исключения, производные от класса Exception. Тип исключения опреде¬лен так потому, что идентификатор Exception добавлен к идентификатору описания исключения. Таблица 5.1. Общие типы исключений Исключение Описание Exception ArgumentException Самое простое исключение; общий контейнер для всех исключений. Когда вы получаете одно из этих исключений, смо¬трите подробности в свойстве Message. Если вы передаете исключение этого типа, его конструктору следует предоставить строку, объясняющую причину его передачи Передается при получении методом недопустимого аргумента. Как правило, в свойстве Message вы можете найти объяснение проблемы с аргументами. Если это исключение передано, значит с содержи¬мым аргументов что-то не так ArgumentNullException ArgumentOutOfRangeException ArithmeticException DivideESyZeroException FormatException IndexOutOfRangeException InsufficientMemoryException InvalidCastException NotlmplementedException NotSupportedException Передается при вызове метода, одним из аргументе; которого является значение null. Причиной може-быть непосредственная передача методу значения null или наличие значения null у одного из аргументов Передается при вызове метода, один из аргументов которого вне ожидаемого диапазона. При схожести с исключением ArgumentException, это более специализировано и определяет, находится ли аргу¬мент в приемлемом диапазоне. Чтобы узнать, какой диапазон приемлем, сверьтесь с документацией метода или просмотрите его реали¬зацию. Если вы передаете это исключение, укажите допустимый диапазон в сообщении об ошибке Передается при математической ошибке Передается при попытке деления на нуль Передается при неправильном формате параметра. Например, если метод ожидает число в формате с точкой, а вы используете запятую, будет передано это исключение Передается при попытке обратиться к массиву по ин¬дексу, выходящему за предел массива. Это исключе¬ние передается тоже, если вы не разместили массив памяти, а затем пытаетесь обратиться к его элемен¬ту, или если вы пытаетесь обратиться к массиву по отрицательному индексу Передается, если недостаточно памяти. Хоть это исключение передается нечасто, оно вполне может быть получено, ёели вы пытаетесь разместить в па¬мяти массив размером около 5 триллионов элемен¬тов (из-за ошибки в значении размера массива) Передается при попытке привести один тип к дру¬гому типу, который не поддерживается. Это исклю¬чение вполне обычное дело, когда вы используете наследование и делаете попытку приведения Передается при использовании методов или СВОЙСТЕ без реализации. Зачастую вам не хватает времени на реализацию всего кода сразу. Для тех свойств или методов, которые не были реализованы, не оставляйте пустых свойств или реализаций мето-да. Вместо того, всегда передавайте исключения. Впоследствии вам будет легче вспомнить, где вы за¬были что-нибудь реализовать Передается при попытке использовать экземпляр интерфейса или метод, который не может сработать Например, если вы откроете буфер чтения-записи для CD-ROM, доступного только для чтения, вы полу¬чите это исключение при попытке записи на CD. Eon/ вы попытаетесь читать из экземпляра интерфейса, исключение не будет передано NullReferenceException 'utOfMemoryException IverflowException 3ystemException Передается при попытке вызова метода или свой-ства, переменная которого не была присвоена эк-земпляру допустимого типа Подобно исключению InsufficientMemoryException Передается при попытке выполнения неподдержи-ваемых числовых операций, вроде суммы 2 милли¬ардов и 2 миллиардов с использованием 32-битовых целых чисел Передается операционной системой. Не пытайтесь создавать классы исключений, производных от этого