До сих пор мы рассматривали исключения, которые генерирует среда выполнения С#, но это может сделать и сам программист. Для генерации исключения используется оператор throw с параметром, определяющим вид исключения. Параметр должен быть объектом, порожденным от стандартного класса System. Exception. Этот объект используется для передачи информации об исключении его обработчику.
Оператор throw употребляется либо с параметром, либо без него:
throw [ выражение ];
Форма без параметра применяется только внутри блока catch для повторной генерации исключения. Тип выражения, стоящего после throw, определяет тип исключения, например:
throw new DivideByZeroException();
Здесь после слова throw записано выражение, создающее объект стандартного класса «ошибка при делении на 0» с помощью операции new.
При генерации исключения выполнение текущего блока прекращается и происходит поиск соответствующего обработчика с передачей ему управления. Обработчик считается найденным, если тип объекта, указанного после throw, либо тот же, что задан в параметре catch, либо является производным от него. Рассмотрим пример, приведенный в спецификации С#:
|
|
using System;
class Test
{
static void F()
{
try
{
G(); // функция, в которой может произойти исключение
}
catch (Exception e)
{
Console.WriteLine("Exception in F: " + e.Message);
e = new Exception("F");
throw; // повторная генерация исключения
}
}
static void G()
{
throw new Exception("G"); // моделирование исключительной ситуации
}
static void Main()
{
try
{
F();
}
catch (Exception e)
{
Console.WriteLine("Exception in Main: " + e.Message);
}
}
}
В методе F выполняется промежуточная обработка исключения, которая заключается в том, что на консоль выводится поле Message перехваченного объекта е (об элементах класса Exception рассказывается в следующем разделе). После этого исключение генерируется заново. Несмотря на то что в обработчике исключения создается новый объект класса Exception с измененной строкой информации, передаваемой в исключении, выбрасывается не этот объект, а тот, который был перехвачен обработчиком, поэтому результат работы программы следующий:
Exception in F: G
Exception in Main: G
Заменим оператор throw таким оператором;
throw e;
В этом случае в обработчике будет выброшено исключение, созданное в предыдущем операторе, и вывод программы изменится:
Exception in F: G
Exception in Main: F
С обработкой исключений мы еще не раз встретимся в примерах программ, приведенных в следующих главах.