Связывание исключений с обработчиками
532 |
Глава 17. Аппарат исключений |
Тип выражения должен совпадать с типом формального параметра какого-то обработчика исключений. Квадратные скобки являются метасимволами, указывающими на необязательность выражения. Оператор throw без операнда может появиться только в обработчике. При этом он повторно возбуждает исключение, которое затем обрабатывается где-нибудь в другом месте. Это полностью повторяет использование оператора raise в Ada без указания имени исключения. По типу выражения throw выбирается конкретный обработчик, имеющий соответствующий тип формального параметра. Более точно: обработчик с формальным параметром типа Т, const T, T & (ссылка на объект типа Т) или const T & соответствует оператору throw с выражением, имеющим тип Т. Если же тип Т обозначает класс, то «соответствующим» считают обработчик, параметр которого имеет тип Т, или любой класс, являющийся предком класса Т.При возникновении исключения вычисления в блоке try прекращаются. Происходит поиск подходящего обработчика. Поиск начинается с обработчика, который непосредственно примыкает к блоку try. Если совпадения нет, исключение распространяется на объемлющий блок (из которого вызывалась функция, где появилось исключение). Последний обработчик часто записывается с формальным параметром «многоточие» (. . .), который соответствует любому исключению. Это гарантирует, что все исключения будут обработаны. После нормального завершения работы обработчика управление передается первому оператору следующего блока try. Если в программе не найден подходящий обработчик, тогда вызывается стандартный обработчик unexpected, который просто останавливает программу. Он может быть замещен пользовательским обработчиком, функцией с заголовком void set_terminate( ). В языке C++ нет предопределенных исключений, но стандартные библиотеки определяют и генерируют исключения, такие как out_of_range, которое может быть создано контейнерными библиотечными классами, и overflow_error, которое может быть сформировано библиотечными математическими функциями. |