Учебно-методический комплекс общее количество часов 58 ч. Лекции 28 ч


catch (Exception) { // Этот блок способен перехватить любую ошибку. } catch


Download 2.46 Mb.
bet57/91
Sana19.10.2023
Hajmi2.46 Mb.
#1709453
TuriУчебно-методический комплекс
1   ...   53   54   55   56   57   58   59   60   ...   91
Bog'liq
Язык программирования C#

catch (Exception)
{
// Этот блок способен перехватить любую ошибку.
}
catch
{
// Этот блок способен перехватить любую ошибку.
// Он совершенно аналогичен предыдущему блоку.
}
finally
{
// Этот блок выполнится в любом случае.
// Сюда помещают код для освобождения занятых ресурсов.
}

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


В C# программах все типы исключений являются производными от System.Exception. Поэтому, если в скобках после ключевого слова try указать тип System.Exception, то этот блок будет реагировать на все исключения. Аналогично если в catch блоке не указать тип исключения, то будет реагировать на исключения любого типа.
Блоки обработки исключений конкурируют между собой за право обработать исключение. CLR рассматривает блоки catch сверху вниз, поэтому сначала следует размещать более специализированные типы исключений. Сначала должны следовать наиболее удаленные потомки, потом – их базовые классы и лишь в конце - System.Exception. В противном случае компилятор сгенерирует ошибку, указывающую на недостижимый код. Например, если в try блоке находится сложное арифметическое выражение, то первый catch блок должен проверять ошибку деления на 0 DivideByZeroException, второй все арифметические исключения ArithmeticException, и т.д. и только последний блок может обрабатывать все оставшиеся исключения.

class Program


{
static void Main(string[] args)
{
int x, y, z;
x = 10;
y = 0;
try
{
z = x / y;
}
catch (DivideByZeroException)
{
Console.WriteLine("Дление на 0!");
}
catch (ArithmeticException)
{
Console.WriteLine("Арифметическая ошибка!");
}
catch
{
Console.WriteLine("Неизвесная ошибка!");
}
}
}
Лист. 4.1

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


Вывод программы:

Дление на 0!


Вывод. 4.1

При использовании исключительных ситуаций catch блок выполниться только в том случае, если возникнет исключение, а после него нормальное выполнение приложения будет прервано. Но часто бывает необходимо, гарантировано, выполнить некоторые действия в независимости произошло или не произошло исключительная ситуация. Обычно необходимость в этом возникает, когда в try блоке выделяются временные ресурсы, которые, гарантировано, нужно освободить. Для этих целей используется блок finally, этот блок выполняется в любом случае.


Чтобы продемонстрировать работу с блоком finally расширим наш предыдущий пример. Вынесем деление и всю структуру try-catch в отдельный метод и добавим к ней блок finally, в котором будут выводиться значения переданных переменных.

static int Divide(int x, int y)


{
int z = 0;
try
{
z = x / y;
}
catch (DivideByZeroException)
{
Console.WriteLine("Дление на 0!");
}
catch (ArithmeticException)
{
Console.WriteLine("Арифметическая ошибка!");
}
catch
{
Console.WriteLine("Неизвесная ошибка!");
}
finally
{
Console.WriteLine("x: {0}", x);
Console.WriteLine("y: {0}", y);
}
return z;
}
Лист. 4.2

Фактически мы написали расширенную реализацию оператора деления, добавив к нему возможность вывода переданных параметров и обработку исключения. Напишем теперь метод для тестирования нашей функции.


static void Main(string[] args)


{
Divide(10, 2);
Divide(5, 0);
}
Лист. 4.3

Этот метод предает в функцию Divide две пары параметров, первая из них вызывает исключение, вторая нет, но обе они выводятся в блоке finally метода Divide.


Вывод программы:

x: 10
y: 2


Дление на 0!
x: 5
y: 0
Вывод. 4.2



Download 2.46 Mb.

Do'stlaringiz bilan baham:
1   ...   53   54   55   56   57   58   59   60   ...   91




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling