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