обработка исключений. Atch может "ловить" любой тип данных, необязательно даже передавать переменную
Скачать 16.42 Kb.
|
1.Во время выполнения программы могут возникать ситуации, когда состояние внешних данных, устройств ввода-вывода или компьютерной системы в целом делает дальнейшие вычисления и работу программы в целом в соответствии с базовым алгоритмом невозможными или бессмысленными. Такие ситуации называются исключительными или просто исключениями. 2. 3. 4.
5.Try и catch – это отдельные блоки, код в которых заключается в фигурные скобки. Блоки следуют строго друг за другом, между ними ничего не должно быть. Оператор throw используется либо в Try блоке либо в функции, которая в нем вызывается. 6.Также называется защищенным блоком. Содержит код, в котором могут возникнуть исключения. Может содержать отдельные инструкции и функции в целом, как одну так и несколько. К нему могут относиться множество catch блоков, каждый из которых будет обрабатывать определенное исключение. 7.Блок перехвата и обработки исключения. Содержит инструкции, выполняемые при возникновении исключительных ситуаций. Основной смысл этих инструкций – корректная обработка исключительной ситуации. После окончания работы блока catch исключение считается обработанным, и управление передается на первую инструкцию, следующую за конструкцией try … catch. Catch может "ловить" любой тип данных, необязательно даже передавать переменную. 8.Первый формат используется, если нам надо указать тип перехватываемого исключения, но не нужно обрабатывать связанное с этим исключением значение (это достигается при использовании второго формата оператора catch). Наконец, третий формат оператора catch позволяет обработать все исключения. Троеточие в этом случае показывает, что будут пойманы все исключения. При таком подходе нельзя указать имя переменной. В случае, если "кидаются" данные нестандартного типа (экземпляры определенных вами классов, структур и т.д.), лучше "ловить" их по ссылке, иначе вся "кидаемая" переменная будет скопирована в стек вместо того, чтобы просто передать указатель на нее. 9.Гораздо более интересным является механизм создания собственных исключений. Для их возбуждения используется оператор throw. Тип выражения, указанного в операторе throw, определяет тип исключительной ситуации, а значение может быть передано обработчику прерываний. Используется с любыми типами данных. Все инструкции, стоящие после этого оператора, не будут выполняться в случае возникновения исключения. Обработка исключений, возбужденных оператором throw, идет по следующей схеме: 1. Создается статическая переменная со значением, заданным в операторе throw. Она будет существовать до тех пор, пока исключение не будет обработано. Если переменная-исключение является объектом класса, при ее создании работает конструктор копирования. 2. Завершается выполнение защищенного try-блока: раскручивается стек подпрограмм, вызываются деструкторы для тех объектов, время жизни которых истекает и т.д. 3. Выполняется поиск первого из catch-блоков, который пригоден для обработки созданного исключения. Поиск ведется по следующим критериям: — если тип, указанный в catch-блоке, совпадает с типом созданного исключения, или является ссылкой на этот тип; — класс, заданный в catch-блоке, является предком класса, заданного в throw, и наследование выполнялось с ключом доступа public; — указатель, заданный в операторе throw, может быть преобразован по стандартным правилам к указателю, заданному в catch-блоке. — в операторе throw задано многоточие. Если нужный обработчик найден, то ему передается управление и, при необходимости, значение оператора throw. Оставшиеся catch-блоки, относящиеся к защищенному блоку, в котором было создано исключение, игнорируются. Из указанных правил поиска следует, что очень важен порядок расположения catch-блоков. Если ни один из catch-блоков, указанных после защищенного блока, не сработал, то исключение считается необработанным. Его обработка может быть продолжена во внешних блоках try |