Перехват одного из стандартных исключений, как в приведенных выше примерах, дает еще одно преимущество: он исключает аварийное завершение программы. Как только исключение будет сгенерировано, оно должно быть перехвачено каким-то фрагментом кода в определенном месте программы. Вообще говоря, если исключение не перехватывается в программе, то оно будет перехвачено исполняющей системой. Но дело в том, что исполняющая система выдаст сообщение об ошибке и прервет выполнение программы. Так, в приведенном ниже примере программы исключение в связи с выходом индекса за границы массива не перехватывается.
// Предоставить исполняющей системе 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 в
Это сообщение уведомляет об обнаружении в методе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;