Следует особо подчеркнуть, что весь код, выполняемый в блокеtry,контролируется на предмет исключительных ситуаций, в том числе и тех, которые могут возникнуть в результате вызойа метода из самого блокаtry.Исключение, генерируемое методом в блокеtry,может быть перехвачено в том же блоке, если, конечно, этого не будет сделано в самом методе.
В качестве еще одного примера рассмотрим следующую программу, где блокtryпомещается в методеMain . Из этого блока вызывается методGenException (), в котором и генерируется исключениеIndexOutOfRangeException.Это исключение не перехватывается методомGenException. Но поскольку методGenException вызывается из блокаtryв методеMain , то исключение перехватывается в блокеcatch,связанном непосредственно с этим блокомtry.
/* Исключение может быть сгенерировано одним методом и перехвачено другим. */
using System;
class ExcTest {
// Сгенерировать исключение, public static void GenException {
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]);
}
Console.WriteLine("He подлежит выводу");
}
}
class ExcDemo2 {
static void Main {
try {
ExcTest.GenException ;
}
catch (IndexOutOfRangeException) {
// Перехватить исключение.
Console.WriteLine("Индекс вышел за границы массива!");
}
Console.WriteLine("После блока перехвата исключения.");
}
}
Выполнение этой программы дает такой же результат, как и в предыдущем примере.
До генерирования исключения.
nums[0]: О
nums[1]: 1
nums[2]: 2
nums[3]: 3
Индекс вышел за границы массива!
После блока перехвата исключения.
Как пояснялось выше, методGenException вызывается из блокаtry,и поэтому генерируемое им исключение перехватывается не в нем, а в блокеcatchвнутри методаMain. А если бы исключение перехватывалось в методеGenException, оно не было бы вообще передано обратно методуMain .
Последствия неперехвата исключений