До цих пір ми розглядали виключення, які генерує середовище виконання С#, але це може зробити і сам програміст. Для генерації виключення використовується оператор throw з параметром, що визначає вид виключення. Параметр має бути об'єктом, породженим від стандартного класу System.Exception. Цей об'єкт використовується для передачі інформації про виключення його обробникові.
Оператор throw викликається або з параметром, або без нього:
throw [ вираз ];
Форма без параметра застосовується тільки усередині блоку catch для повторної генерації виключення. Тип виразу, що стоїть після throw, визначає тип виключення, наприклад:
throw new DivideByZeroException( );
Тут після слова throw записаний вираз, що створює об'єкт стандартного класу “помилка при діленні на 0” за допомогою операції new. При генерації виключення виконання поточного блоку припиняється і відбувається пошук відповідного обробника з передачею йому управління. Обробник вважається знайденим, якщо тип об'єкту, вказаного після throw, або той же що заданий в параметрі catch, або є похідним від нього.
Розглянемо приклад генерації виключень на лістингу 4.12.
Лістинг 4.12. Генерація виключень
using System;
namespace ConsoleApplication1
{
class Test
{
static void F()
{
try
{
G();
}
catch (Exception e)
{
Console.WriteLine("Exception in F: " + e.Message);
e = new Exception("F");
throw e; // повторна генерація виключення
}
}
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