Поделиться через


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 перехвата не существует предложения.