На этом шаге мы рассмотрим средства преднамеренной генерации исключений.
Исключения можно генерировать преднамеренно. Речь идет не о том, чтобы написать команду, выполнение которой приводит к ошибке. Речь идет об использовании специальной инструкции, выполнение которой имеет такие же последствия, как и возникновение ошибки.
Сгенерировать исключение достаточно просто. Для этого используют инструкцию throw, после которой указывается объект исключения. Объект исключения можно создать в явном виде (то есть так, как создаются объекты обычных классов). Также в catch-блоке можно воспользоваться объектом, созданным автоматически при возникновении реальной ошибки (повторная генерация исключения). Правда исключение, перехваченное в catch-блоке, может быть сгенерировано повторно и более простым способом. Для этого используют инструкцию throw, не указывая явно объект исключения.
Само по себе создание объекта на основе класса исключения не означает генерирования исключения. Необходимо использовать инструкцию throw, после которой указать объект исключения.
В примере ниже представлена программа, в которой искусственно генерируются исключения.
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace pr225_1 { // Класс с главным методом: class Program { // Главный метод: static void Main() { // Внешний try-блок: try { // Внутренний try-блок: try { Console.WriteLine("Ceйчac будет ошибка..."); // Генерация исключения: throw new ArithmeticException("Какая-то ошибка"); } // Перехват исключения во внутреннем блоке: catch (ArithmeticException e) { Console.WriteLine(e.Message); // Повторное генерирование исключения: throw; } } // Перехват исключения во внешнем блоке: catch (ArithmeticException e) { Console.WriteLine("Еще раз: \"{0}\"", e.Message); } // Задержка: Console.ReadLine(); } } }
Результат выполнения программы представлен ниже:

Рис.1. Результат выполнения программы
В этой программе используются вложенные try-блоки. Во внутреннем try-блоке после выполнения команды
Console.WriteLine("Ceйчac будет ошибка...");
new ArithmeticException("Какая-то ошибка");
В принципе, мы могли бы создать обычный (не анонимный) объект класса ArithmeticException, а затем указать этот объект в throw-инструкции. Еще раз подчеркнем, что само по себе
создание объекта исключения не приводит к генерации ошибки.
Перехват сгенерированного исключения выполняется во внутреннем catch-блоке. Там командой
Console.WriteLine(e.Message);
Механизм искусственной генерации исключений используется в самых разных ситуациях (например, для множественной обработки исключений) и позволяет значительно повысить гибкость программного кода.
На следующем шаге мы рассмотрим пользовательские классы исключений.