throw new ExceptB("Перехват исключения типа ExceptB");
else
throw new Exception();
}
catch (ExceptB exc) {
Console.WriteLine(exc);
}
catch (ExceptA exc) {
Console.WriteLine(exc);
}
catch (Exception exc) {
Console.WriteLine(exc);
}
}
}
}
Вот к какому результату приводит выполнение этой программы.
Перехват исключения типа ExceptA.
Перехват исключения типа ExceptB.
System.Exception: Выдано исключение типа "System.Exception".
в OrderMatters.Main() в
Обратите внимание на порядок следования операторов catch
. Именно в таком порядке они и должны выполняться. Класс ExceptB
является производным от класса ExceptA
, поэтому исключение типа ExceptB
должно перехватываться до исключения типа ExceptA.
Аналогично, исключение типа Exception (т.е. базового класса для всех исключений) должно перехватываться последним. Для того чтобы убедиться в этом, измените порядок следования операторов catch. В итоге это приведет к ошибке во время компиляции.
Полезным примером использования оператора catch
, перехватывающего исключения базового класса, служит перехват всей категории исключений. Допустим, что создается ряд исключений для управления некоторым устройством. Если сделать их классы производными от общего базового класса, то в тех приложениях, где необязательно выяснять конкретную причину возникшей ошибки, достаточно перехватывать исключение базового класса и тем самым исключить ненужное дублирование
Применение ключевых слов checked и unchecked
В C# имеется специальное средство, связанное с генерированием исключений, возникающих при переполнении в арифметических вычислениях. Как вам должно быть уже известно, результаты некоторых видов арифметических вычислений могут превышать диапазон представления чисел для типа данных, используемого в вычислении. В этом случае происходит так называемое
byte a, b, result;
а = 127;
b = 127;
result = (byte)(а * b);
В этом коде произведение значений переменных а и b превышает диапазон представления чисел для типа byte. Следовательно, результат вычисления данного выражения приводит к переполнению для типа данных, сохраняемого в переменной result
.
В C# допускается указывать, будет ли в коде сгенерировано исключение при переполнении, с помощью ключевых слов checked
и unchecked
. Так, если требуется указать, что выражение будет проверяться на переполнение, следует использовать ключевое слово checked
, а если требуется проигнорировать переполнение — ключевое слово unchecked
. В последнем случае результат усекается, чтобы не выйти за пределы диапазона представления чисел для целевого типа выражения.
У ключевого слова checked
имеются две общие формы. В одной форме проверяется конкретное выражение, и поэтому она называется
checked (
checked {
// проверяемые операторы
}
где OverflowException
.
У ключевого слова unchecked
также имеются две общие формы. В первой, операторной форме переполнение игнорируется при вычислении конкретного выражения. А во второй, блочной форме оно игнорируется при выполнении блока операторов:
unchecked (
unchecked {
// операторы, для которых переполнение игнорируется
}
где
Ниже приведен пример программы, в котором демонстрируется применение ключевых слов checked
и unchecked
.
// Продемонстрировать применение ключевых слов checked и unchecked.
using System;
class CheckedDemo {
static void Main() {
byte a, b;
byte result;
a = 127;
b = 127;
try {
result = unchecked((byte) (a * b));
Console.WriteLine("Непроверенный на переполнение результат: " + result);