21 Исключения
21.1 Общие
Исключения в C# предоставляют структурированный, универсальный и типобезопасный способ обработки как системного уровня, так и условий ошибки на уровне приложения.
21.2 Причины исключений
Исключения можно создавать двумя разными способами.
- Оператор
throw
(§13.10.6) вызывает исключение немедленно и безоговорочно. Элемент управления никогда не достигает инструкцииthrow
сразу после. - Некоторые исключительные условия, возникающие при обработке инструкций и выражений C#, вызывают исключение в определенных обстоятельствах, когда операция не может быть выполнена нормально. См . статью 21.5 для списка различных исключений, которые можно вызвать таким образом.
Пример: целочисленная операция деления (§12.10.3) создает
System.DivideByZeroException
исключение, если знаменатель равен нулю. пример конца
21.3 Класс System.Exception
Класс System.Exception
является базовым типом всех исключений. Этот класс имеет несколько заметных свойств, которые совместно используют все исключения:
Message
— это свойствоstring
типа, доступного только для чтения, которое содержит описание причины исключения, доступной для чтения.InnerException
— это свойство типаException
только для чтения. Если его значение не равноnull
, оно ссылается на исключение, вызвавшее текущее исключение. (То есть текущее исключение было создано в блоке catch, обрабатывающегоInnerException
.) В противном случае значение имеет значениеnull
, указывающее, что это исключение не было вызвано другим исключением. Количество объектов исключений, связанных таким образом, может быть произвольным.
Значение этих свойств можно указать в вызовах конструктора экземпляра для System.Exception
.
21.4 Как обрабатываются исключения
Исключения обрабатываются оператором try
(§13.11).
При возникновении исключения (§21.2) система ищет ближайшее предложение catch, которое может обрабатывать исключение, как определено типом исключения во время выполнения. Во-первых, текущий метод ищет лексически заключенную try
инструкцию, а связанные catch
предложения инструкции try
рассматриваются в порядке. Если это не удается, метод, вызываемый текущим методом, выполняется поиск лексически заключающей try
инструкции, которая заключает точку вызова текущего метода. Этот поиск продолжается до тех пор, пока catch
предложение не будет найдено, которое может обрабатывать текущее исключение, именовав класс исключений, имеющий тот же класс или базовый класс, типа времени выполнения вызываемого исключения. Предложение catch
, которое не называет класс исключений, может обрабатывать любое исключение.
После обнаружения соответствующего catch
предложения система готовится передать контроль первому оператору catch
предложения. Перед началом выполнения catch
предложения система сначала выполняет все finally
предложения, связанные с try
операторами, более вложенными, чем тот, который поймал исключение.
Если предложение сопоставления catch
не найдено:
- Если поиск соответствующего
catch
предложения достигает статического конструктора (§15.12) или инициализатора статического поля,System.TypeInitializationException
создается в точке, которая вызвала вызов статического конструктора. Внутреннее исключение содержит исключениеSystem.TypeInitializationException
, которое было первоначально создано. - В противном случае, если во время выполнения средства завершения возникает исключение, и это исключение не поймано, поведение не указано.
- В противном случае, если поиск сопоставленных
catch
предложений достигает кода, который изначально запустил поток, то выполнение потока завершается. Влияние такого прекращения определяется реализацией.
21.5 Распространенные классы исключений
Следующие исключения создаются определенными операциями C#.
Тип исключения | Description |
---|---|
System.ArithmeticException |
Базовый класс для исключений, которые возникают при выполнении арифметических операций, таких как System.DivideByZeroException и System.OverflowException . |
System.ArrayTypeMismatchException |
Возникает при сбое хранилища в массиве, так как тип хранимого элемента несовместим с типом массива. |
System.DivideByZeroException |
Возникает при попытке разделить целочисленное значение на ноль. |
System.IndexOutOfRangeException |
Возникает при попытке индексировать массив через индекс, который меньше нуля или за пределами границ массива. |
System.InvalidCastException |
Вызывается при явном преобразовании из базового типа или интерфейса в производный тип во время выполнения. |
System.NullReferenceException |
Возникает при null использовании ссылки таким образом, что требуется объект, на который ссылается ссылка. |
System.OutOfMemoryException |
Возникает при сбое попытки выделения памяти (через new ). |
System.OverflowException |
Возникает при переполнении арифметической операции в контексте checked . |
System.StackOverflowException |
Возникает при исчерпании стека выполнения слишком много ожидающих вызовов; обычно указывает на очень глубокую или несвязанную рекурсию. |
System.TypeInitializationException |
Возникает, когда статический конструктор или инициализатор статических полей создает исключение, и для catch перехвата не существует предложения. |
ECMA C# draft specification