Иерархия исключений

April 7, 2010 by admin Комментировать »

Все классы исключений C# являются производными от класса Exception, который является частью Common Language Runtime[1]. При возникновении исключения блок catch выбирается среди подходящих блоков, для чего тип исключения сравнивается с типом, указанным в блоке. Блокам catch с точным совпадением типа отдается предпочтение перед более общими исключениями. Вернемся к нашему примеру:

using System;

class Test

{

static int Zero = 0;

public static void Main()

{

try

{

int j = 22 / Zero;

}

// Перехватить конкретное исключение

catch (DivideByZeroException e)

{

Console.WriteLine("DivideByZero {0}", e);

}

// Перехватить все остальные исключения

catch (Exception e)

{

Console.WriteLine("Exception {0}", e);

}

}

}

Блок catch, перехватывающий исключение DivideByZeroException, обеспечивает более точное совпадение, поэтому будет выполнен именно он.

Следующий пример посложнее.

using System;

class Test

{

static int Zero = 0;

static void AFunction()

{

int j = 22 / Zero;

// Следующая строка никогда не выполняется.

Console.WriteLine("In AFunction()");

}

public static void Main()

{

try

{

AFunction();

}

catch (DivideByZeroException e)

{

Console.WriteLine("DivideByZero {0}", e);

}

}

}

Что здесь происходит?

При выполнении деления генерируется исключение. Среда начинает поиск блока try в функции AFunction(), но не находит его, поэтому выходит из AFunction() и продолжает поиск в Main(). После успешного нахождения блока начинается поиск подходящего блока catch. Найденный блок выполняется.

В некоторых ситуациях поиски подходящего блока catch не дают результата.

using System;

class Test

{

static int Zero = 0;

static void AFunction()

{

try

{

int j = 22 / Zero;

}

// Исключение не подходит

catch (ArgumentOutOfRangeException e)

{

Console.WriteLine("OutOfRangeException: {0}", e);

}

Console.WriteLine("In AFunction()");

}

public static void Main()

{

try

{

AFunction();

}

// Исключение не подходит

catch (ArgumentException e)

{

Console.WriteLine("ArgumentException {0}", e);

}

}

}

Ни блок catch в AFunction(), ни блок catch в Main() не подходят к типу инициированного исключения. В подобных ситуациях исключение перехватывается стандартным обработчиком исключения. Предпринимаемые действия зависят от конфигурации среды, но обычно обработчик выводит на экран диалоговое окно с информацией об исключении и останавливает работу программы.


[1] В общем случае это относится ко всем классам .NET, однако встречаются отдельные исключения.

Кстати ищу отдых на лето, вот набрел на отличный сайт про туризм.

Оставить комментарий

микросхемы мощности Устройство импульсов питания пример приемника провода витков генератора выходе напряжение напряжения нагрузки радоэлектроника работы сигнал сигнала сигналов управления сопротивление усилитель усилителя усиления устройства схема теория транзистора транзисторов частоты