Шрифт:
Выполнение этой программы дает такой же результат, как и в предыдущем примере. До генерирования исключения. nums[0]: 0 nums[1]: 1 nums[2]: 2 nums[3]: 3 Индекс вышел за границы массива! После блока перехвата исключения.
Как пояснялось выше, метод GenException вызывается из блока try, и поэтому генерируемое им исключение перехватывается не в нем, а в блоке catch внутри мето да Main. А если бы исключение перехватывалось в методе GenException, оно не было бы вообще передано обратно методу Main. Последствия неперехвата исключений
Перехват одного из стандартных исключений, как в приведенных выше примерах, дает еще одно преимущество: он исключает аварийное завершение программы. Как только исключение будет сгенерировано, оно должно быть перехвачено каким-то фраг ментом кода в определенном месте программы. Вообще говоря, если исключение не перехватывается в программе, то оно будет перехвачено исполняющей системой. Но дело в том, что исполняющая система выдаст сообщение об ошибке и прервет выпол нение программы. Так, в приведенном ниже примере программы исключение в связи с выходом индекса за границы массива не перехватывается. // Предоставить исполняющей системе C# возможность самой обрабатывать ошибки. using System; class NotHandled { static void Main { int[] nums = new int[4]; Console.WriteLine("До генерирования исключения."); // Сгенерировать исключение в связи с выходом индекса за границы массива. for(int i=0; i < 10; i++) { nums[i] = i; Console.WriteLine("nums[{0}]: {1}", i, nums[i]); } } }
Когда возникает ошибка индексирования массива, выполнение программы преры вается и выдается следующее сообщение об ошибке. Необработанное исключение: System.IndexOutOfRangeException: Индекс находился вне границ массива. в NotHandled.Main в <имя_файла>:строка 16
Это сообщение уведомляет об обнаружении в методе NotHandled.Main необра ботанного исключения типа System.IndexOutOfRangeException, которое связано с выходом индекса за границы массива.
Такие сообщения об ошибках полезны для отладки программы, но, по меньше мере, нежелательны при ее использовании на практике! Именно поэтому так важно организовать обработку исключительных ситуаций в самой программе.
Как упоминалось ранее, тип генерируемого исключения должен соответствовать типу, указанному в операторе catch. В противном случае исключение не будет пере хвачено. Например, в приведенной ниже программе предпринимается попытка пере хватить ошибку нарушения границ массива в блоке catch, реагирующем на исключе ние DivideByZeroException, связанное с делением на нуль и являющееся еще одним стандартным исключением. Когда индексирование массива выходит за его границы, генерируется исключение IndexOutOfRangeException, но оно не будет перехвачено блоком catch, что приведет к аварийному завершению программы. // Не сработает! using System; class ExcTypeMismatch { static void Main { int[] nums = new int[4]; try { Console.WriteLine("До генерирования исключения."); // Сгенерировать исключение в связи с выходом индекса за границы массива. for(int i=0; i < 10; i++) { nums[i] = i; Console.WriteLine("nums[{0}]: {1}", i, nums[i]); } Console.WriteLine("He подлежит выводу"); } /* Если перехват рассчитан на исключение DivideByZeroException, то перехватить ошибку нарушения границ массива не удастся. */ catch (DivideByZeroException) { // Перехватить исключение. Console.WriteLine("Индекс вышел за границы массива!"); } Console.WriteLine("После блока перехвата исключения."); } }
Вот к какому результату приводит выполнение этой программы. До генерирования исключения. nums[0]: 0 nums[1]: 1 nums[2]: 2 nums[3]: 3 Необработанное исключение: System.IndexOutOfRangeException: Индекс находился вне границ массива в ExcTypeMismatch.Main в <имя_файла>:строка 18
Как следует из приведенного выше результата, в блоке catch, реагирующем на исключение DivideByZeroException, не удалось перехватить исключение IndexOutOfRangeException. Обработка исключительных ситуаций - “изящный” способ устранения программных ошибок
Одно из главных преимуществ обработки исключительных ситуаций заключается в том, что она позволяет вовремя отреагировать на ошибку в программе и затем про должить ее выполнение. В качестве примера рассмотрим еще одну программу, в кото рой элементы одного массива делятся на элементы другого. Если при этом происходит деление на нуль, то генерируется исключение DivideByZeroException. Обработка подобной исключительной ситуации заключается в том, что программа уведомляет об ошибке и затем продолжает свое выполнение. Таким образом, попытка деления на нуль не приведет к аварийному завершению программы из-за ошибки при ее вы полнении. Вместо этого ошибка обрабатывается "изящно", не прерывая выполнение программы. // Изящно обработать исключительную ситуацию и продолжить выполнение программы. using System; class ExcDemo3 { static void Main { int[] numer = { 4, 8, 16, 32, 64, 128 }; int[] denom = { 2, 0, 4, 4, 0, 8 }; for(int i=0; i < numer.Length; i++) { try { Console.WriteLine(numer[i] + " / " + denom[i] + " равно " + numer[i]/denom[i]); } catch (DivideByZeroException) { // Перехватить исключение. Console.WriteLine("Делить на нуль нельзя!"); } } } }
Ниже приведен результат выполнения этой программы. 4/2 равно 2 Делить на нуль нельзя! 16/4 равно 4 32/4 равно 8 Делить на нуль нельзя! 128 / 8 равно 16
Из данного примера следует еще один важный вывод: как только исключение обра ботано, оно удаляется из системы. Поэтому в приведенной выше программе проверка ошибок в блоке try начинается снова на каждом шаге цикла for, при условии, что все предыдущие исключительные ситуации были обработаны. Это позволяет обрабаты вать в программе повторяющиеся ошибки. Применение нескольких операторов catch
С одним оператором try можно связать несколько операторов catch. И на прак тике это делается довольно часто. Но все операторы catch должны перехватывать ис ключения разного типа. В качестве примера ниже приведена программа, в которой перехватываются ошибки выхода за границы массива и деления на нуль. // Использовать несколько операторов catch. using System; class ExcDemo4 { static void Main { // Здесь массив numer длиннее массива denom. int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 }; int[] denom = { 2, 0, 4, 4, 0, 8 }; for(int i=0; i < numer.Length; i++) { try { Console.WriteLine(numer[i] + " / " + denom[i] + " равно " + numer[i]/denom[i]); } catch (DivideByZeroException) { Console.WriteLine("Делить на нуль нельзя!"); } catch (IndexOutOfRangeException) { Console.WriteLine("Подходящий элемент не найден."); } } } }
Жанры
- Романы
- Приключения
- Детективы
- Техно триллер
- Дамский детективный роман
- Исторические детективы
- Классические детективы
- Шпионские детективы
- Триллеры
- Юридический триллер
- Крутой детектив
- Полицейские детективы
- Медицинский триллер
- Иронические детективы
- Боевики
- Криминальные детективы
- Политические детективы
- Маньяки
- Зарубежные детективы
- Прочие Детективы
- Спецслужбы
- Драматургия
- Фантастика
- Хентай
- Ранобэ
- Сянься
- Дорама
- Уся
- Аниме
- Космоопера
- Юмористическая фантастика
- Боевая фантастика
- Героическая фантастика
- Технофэнтези
- Готический роман
- Социально-философская фантастика
- Попаданцы
- Историческая фантастика
- Ироническая фантастика
- Зарубежная фантастика
- Историческое фэнтези
- Юмористическое фэнтези
- Детективная фантастика
- Эпическая фантастика
- Мистика
- Космическая фантастика
- Фантастика: прочее
- Постапокалипсис
- Научная фантастика
- Киберпанк
- Альтернативная история
- Ненаучная фантастика
- РПГ
- Стимпанк
- Ироническое фэнтези
- Ужасы и мистика
- Сказочная фантастика
- Фэнтези
- Городское фэнтези
- Эзотерика
- Проза
- Военная проза
- Легкая проза
- Сентиментальная проза
- Советская классическая проза
- Антисоветская литература
- Афоризмы
- Эпистолярная проза
- Новелла
- Семейный роман
- Рассказ
- Классическая проза
- Эпопея
- Эссе
- Проза прочее
- Повесть
- Магический реализм
- Современная проза
- Контркультура
- Роман
- Историческая проза
- Русская классическая проза
- Феерия
- Стихи и поэзия
- Юмор
- Дом и досуг
- Рыбалка
- Охота
- Здоровье детей
- Домашние животные
- Воспитание детей
- Отдых / туризм
- Зарубежная прикладная литература
- Прочее домоводство
- Прикладная литература
- Домашнее хозяйство
- Кулинария
- Медицина и здоровье
- Сделай сам
- Спорт
- Хобби и ремесла
- Образовательная литература
- Сад и Огород
- Здоровье и красота
- Развлечения
- Коллекционирование
- Секс / секс-руководства
- Образование и наука
- Боевые искусства
- Органическая химия
- Обществознание
- Военная история
- Ветеринария
- Ораторское искусство / риторика
- Физика
- Химия
- Семейная психология
- Военная техника и вооружение
- Иностранные языки
- Прочая научная литература
- Психотерапия и консультирование
- Биохимия
- Cпецслужбы
- Астрономия и Космос
- Школьные учебники
- Учебная и научная литература
- Учебники
- Государство и право
- Психология
- Литературоведение
- История
- Научно-популярная литература
- Политика
- Детская психология
- Юриспруденция
- Шпаргалки
- Педагогика
- Физическая химия
- Медицина
- Биофизика
- Языкознание
- Зарубежная образовательная литература
- Зоология
- Геология и география
- Краткое содержание
- Зарубежная психология
- Саморазвитие / личностный рост
- Технические науки
- Религиоведение
- Военное дело
- Личная эффективность
- Аналитическая химия
- Рефераты
- Экология
- Философия
- Альтернативная медицина
- Математика
- Культурология
- Военное дело: прочее
- Ботаника
- Биология
- Словари и Энциклопедии
- Финансы и бизнес
- Отраслевые издания
- Бухучет и аудит
- Недвижимость
- Деловая литература
- Ценные бумаги
- Внешнеэкономическая деятельность
- Торговля
- Зарубежная деловая литература
- О бизнесе популярно
- Стартапы и создание бизнеса
- Корпоративная культура
- Управление, подбор персонала
- Маркетинг, PR, реклама
- Личные финансы
- Работа с клиентами
- Менеджмент
- Интернет-бизнес
- Поиск работы, карьера
- Малый бизнес
- Делопроизводство
- Государственное и муниципальное управление
- Банковское дело
- Экономика
- Книги по IT
- Техника
- Древние книги
- Документальное
- Прочее
- Интерьеры
- Газеты и журналы
- Театр
- Музыка
- Комиксы / манга
- Зарубежная классика
- Современная зарубежная литература
- Изобразительное искусство, фотография
- Мода и стиль
- Искусство и Дизайн
- Зарубежная литература о культуре и искусстве
- Фанфик
- Подростковая литература
- Шахматы
- Кино
- Культура и искусство
- Недописанное
- Классическая литература
- Без Жанра
- Народные
- Книги Для Детей
- Детские остросюжетные
- Сказки
- Детские стихи
- Прочая детская литература
- Детская образовательная литература
- Книги для дошкольников
- Детская фантастика
- Детские детективы
- Книга-игра
- Детский фольклор
- Буквари
- Детская проза
- Детская познавательная и развивающая литература
- Внеклассное чтение
- Зарубежные детские книги
- Детские приключения