Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

16.Исключения

Исключения в языке C# обеспечивают структурированный, единообразный и типобезопасный способ обработки состояний ошибки, как на системном уровне, так и на уровне приложения. Механизм исключения в языке C# вполне сходен с механизмом в языке C++, с несколькими важными отличиями:

  • в C# все исключения должны быть представлены экземпляром типа класса, производным от System.Exception. В C++ для представления исключения может использоваться любое значение любого типа;

  • в C# блок finally (§8.10) может использоваться для записи кода завершения, который выполняется как при нормальном выполнении, так и при исключительных состояниях. Такой код труден для написания в C++ без дублирования кода;

  • в C# исключения системного уровня, такие как переполнение, деление на нуль и разыменование null, имеют хорошо определенные классы исключений и находятся на одном уровне с состояниями ошибки уровня приложения.

16.1Причины исключений

Исключения могут вызываться двумя разными способами.

  • Оператор throw (§8.9.5) вызывает исключение немедленно и безусловно. Управление никогда не передается оператору, следующему за оператором throw.

  • Определенные исключительные состояния, возникающие при обработке операторов и выражения C#, служат причиной исключения в определенных обстоятельствах, когда операцию не удается выполнить нормально. Например, операция целочисленного деления (§7.8.2) создает исключение System.DivideByZeroException, если знаменатель равен нулю. Список различных исключений, которые могут возникнуть таким образом, см. в §16.4.

16.2Класс System.Exception

Класс System.Exception является базовым типом для всех исключений. Этот класс имеет несколько примечательных свойств, которые совместно используются всеми исключениями:

  • Message — свойство только для чтения, типа string, содержащее удобочитаемое описание причины исключения;

  • InnerException — свойство только для чтения, типа Exception. Если его значение не NULL, оно ссылается на исключение, вызвавшее текущее исключение — то есть, текущее исключение было вызвано при обработке блока catch свойства InnerException. Иначе его значение, равное NULL, указывает, что это исключение не было вызвано другим исключением. Количество объектов исключения, сцепленных вместе таким образом, может быть произвольным.

Значения этих свойств можно указывать в вызовах конструктора экземпляров для System.Exception.

16.3Обработка исключений

Исключения обрабатываются оператором try (§8.10).

Когда происходит исключение, система ищет ближайшее предложение catch, которое может обработать исключение, как это определено типом времени выполнения исключения. Сначала в текущем методе выполняется поиск лексически объемлющего оператора try, и связанные предложения catch оператора try рассматриваются по порядку. Если это не удается, в методе, вызвавшем текущий метод, выполняется поиск лексически объемлющего оператора try, который содержит точку вызова текущего метода. Этот поиск продолжается, пока не будет найдена конструкция catch, которая может обработать текущее исключение, назвав имя класса исключения такого же класса или базового класса в выполняемом типе созданного исключения. Конструкция catch, которая не именует класс исключения, может обрабатывать любое исключение.

Когда соответствующая конструкция catch найдена, система подготавливает передачу управления первому оператору конструкции catch. Прежде чем начинается выполнение конструкции catch, система сначала последовательно выполняет все предложения finally связанные с операторами try с большим уровнем вложенности, чем тот оператор, который вызвал исключение.

Если соответствующая конструкция catch не найдена, выполняется одно из следующих двух действий:

  • если поиск соответствующей конструкции catch доходит до статического конструктора (§10.12) или инициализатора статического поля, создается исключение System.TypeInitializationException в точке, запустившей вызов статического конструктора. Внутреннее исключение System.TypeInitializationException содержит то исключение, которое возникло первоначально;

  • если поиск соответствующих предложений catch достигает кода, который первоначально запустил поток, выполнение потока завершается. Влияние такого завершения определяется реализацией.

Исключения, происходящие при выполнении деструктора, заслуживают особого упоминания. Если исключение происходит при выполнения деструктора и не перехватывается, выполнение этого деструктора завершается и вызывается деструктор базового класса (если он имеется). Если нет базового класса (как в случае типа object) или нет деструктора базового класса, исключение удаляется.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]