Книга: C# 4.0: полное руководство
Вложение блоков try
Вложение блоков try
Один блок try
может быть вложен в другой. Исключение, генерируемое во внутреннем блоке try
и не перехваченное в соответствующем блоке catch, передается во внешний блок try. В качестве примера ниже приведена программа, в которой исключение IndexOutOfRangeException
перехватывается не во внутреннем, а во внешнем блоке try
.
// Использовать вложенный блок try.
using System;
class NestTrys {
static void Main() {
// Здесь массив numer длиннее массива denom.
int[] numer = { 4, 8, 16, 32, 64, 128, 256, 512 };
int[] denom = { 2, 0, 4, 4, 0, 8 };
try { // внешний блок try
for(int i=0; i < numer.Length; i++) {
try { // вложенный блок try
Console.WriteLine(numer[i] + " / " +
denom[i] + " равно " + numer[i]/denom[i]);
}
catch (DivideByZeroException) {
Console.WriteLine("Делить на нуль нельзя!");
}
}
}
catch (IndexOutOfRangeException) {
Console.WriteLine("Подходящий элемент не найден.");
Console.WriteLine("Неисправимая ошибка - программа прервана.");
}
}
}
Выполнение этой программы приводит к следующему результату.
4/2 равно 2
Делить на нуль нельзя!
16/4 равно 4
32/4 равно 8
Делить на нуль нельзя!
128 / 8 равно 16
Подходящий элемент не найден.
Неисправимая ошибка - программа прервана.
В данном примере исключение, обрабатываемое во внутреннем блоке try
и связанное с ошибкой из-за деления на нуль, не мешает дальнейшему выполнению программы. Но ошибка нарушения границ массива, обнаруживаемая во внешнем блоке try, приводит к прерыванию программы.
Безусловно, приведенный выше пример демонстрирует далеко не единственное основание для применения вложенных блоков try
, тем не менее из него можно сделать важный общий вывод. Вложенные блоки try
нередко применяются для обработки различных категорий ошибок разными способами. В частности, одни ошибки считаются неисправимыми и не подлежат исправлению, а другие ошибки незначительны и могут быть обработаны немедленно. Как правило, внешний блок try
служит для обнаружения.и обработки самых серьезных ошибок, а во внутренних блоках try
обрабатываются менее серьезные ошибки. Кроме того, внешний блок try
может стать "универсальным" для тех ошибок, которые не подлежат обработке во внутреннем блоке.
- Класс System.Exception
- Основы обработки исключительных ситуаций
- Последствия неперехвата исключений
- Обработка исключительных ситуаций - “изящный” способ устранения программных ошибок
- Применение нескольких операторов catch
- Перехват всех исключений
- Вложение блоков try
- Генерирование исключений вручную
- Использование блока finally
- Подробное рассмотрение класса Exception
- Получение производных классов исключений
- Перехват исключений производных классов
- Применение ключевых слов checked и unchecked
- Вложение файлов в элементы списков
- 12.4.2. PortSentry
- Software and Poetry
- Remote Registry Editor
- Catalog Entry Properties
- Функция pthread_rwlock_trywrlock
- 5.2.1. Kernel Entry Point: head.o
- 3.4 ЧТЕНИЕ И ЗАПИСЬ ДИСКОВЫХ БЛОКОВ
- 6.3.7. Entry Consistency
- Auditing the registry
- Handling Exceptions Using the try-catch Statement
- 10.4.4.2. Только GLIBC: TEMP_FAILURE_RETRY()