Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / Конспект лекций (C#).pdf
Скачиваний:
864
Добавлен:
27.05.2015
Размер:
2.03 Mб
Скачать

try

{

int a; try

{

a = Convert.ToInt32(A_TB.Text);

}

catch (FormatException)

{

a = 1;

}

R_TB.Text = String.Format(

"Результат выражения 1000/{0} равен {1}", a, 1000/a);

}

catch (DivideByZeroException)

{

R_TB.Text = "Ошибка: деление на 0";

}

В блоке catch может не указываться тип исключения. В этом случае такой блок располагается самым последним и обрабатывает все типы исключений, не обработанные до него.

2.18.3 Блок try...finally

Блок try...finally применяется для создания фрагмента кода, который должен выполниться даже в том случае возникновения исключения. Формальная структура данного блока имеет вид:

try

{

<блок кода, проверяемый на ошибки>

}

finally

{

<обязательно выполняемый фрагмент кода>

}

Алгоритм работы блока try...finally следующий. При возникновении ошибки в блоке <блок кода, проверяемый на ошибки> дальнейшее выполнение данного блока прекращается и управление передаются блоку finally (т.е. вы-

полняется блок <обязательно выполняемый фрагмент кода>).

Если в блоке <блок кода, проверяемый на ошибки> не возникло оши-

бок, то управление передаётся блоку finally.

Следует отметить, что возникающая ошибка останется необработанной, т.е. будет выдано стандартное сообщение о необработанной ошибке.

Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Результат вывести в

43

компонент R_TB класса TextBox. Если число введено неправильно или равно 0, то считать его значение равным 1.

int a=1; try

{

a = Convert.ToInt32(A_TB.Text); if (a==0)

a = 1;

}

finally

{

R_TB.Text = String.Format(

"Результат выражения 1000/{0} равен {1}", a, 1000/a);

}

2.18.4 Блок try...catch...finally

Чтобы не оставалось необработанных ошибок при использовании блока try...finally, он, как правило, применяется в сочетании с блоком try...catch, путём добавления после него блока finally. При этом, в некоторых случаях блоки catch могут остаться пустыми.

Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Результат вывести в компонент R_TB класса TextBox. Если число введено неправильно или равно 0, то считать его значение равным 1.

int a=1; try

{

a = Convert.ToInt32(A_TB.Text); if (a==0)

a = 1;

}

catch (Exception)

{

}

finally

{

R_TB.Text = String.Format(

"Результат выражения 1000/{0} равен {1}", a, 1000/a);

}

44

2.18.5 Оператор throw

В приведённых выше примерах исключения генерировались программой автоматически. Однако в некоторых случаях бывает полезным сгенерировать исключение вручную. Формальное описание оператора генерации исключения имеет вид:

throw <объект класса исключения>;

Во многих случаях генерация исключения объединяется с созданием объекта, например:

throw new Exception("Неправильно введены данные");

Пример: найти результат целочисленного деления числа 1000 на число a, которое пользователь вводит в компоненте A_TB класса TextBox. Число a должно быть в диапазоне -100...100. Результат вывести в компонент R_TB класса TextBox.

try

{

int a = Convert.ToInt32(A_TB.Text); if (a < -100 || a > 100)

throw new Exception("Число А должно быть в диапазоне -100...100"); R_TB.Text = String.Format(

"Результат выражения 1000/{0} равен {1}", a, 1000/a);

}

catch (FormatException)

{

R_TB.Text = "Ошибка: число А должно быть целым";

}

catch (DivideByZeroException)

{

R_TB.Text = "Ошибка: деление на 0";

}

catch (Exception E)

{

R_TB.Text = E.Message;

}

С помощью оператора throw можно повторно сгенерировать исключение после его обработки в блоке catch для того, чтобы оно также было обработано во внешнем блоке catch. Для этого во внутреннем блоке catch последним оператором указывается оператор throw без параметров.

Например, предыдущий пример может быть записан следующим образом:

try

{

int a=0; try

{

a = Convert.ToInt32(A_TB.Text);

45

if (a < -100 || a > 100) throw new Exception(

"Число А должно быть в диапазоне -100...100");

}

catch (FormatException)

{

MessageBox.Show("Ошибка: число А должно быть целым"); throw;

}

catch (Exception E)

{

MessageBox.Show(E.Message);

throw;

}

R_TB.Text = String.Format(

"Результат выражения 1000/{0} равен {1}", a, 1000/a);

}

catch (Exception)

{

R_TB.Text = "Результат не найден из-за неправильного ввода числа А";

}

46