Глава 22. Обработка исключительных ситуаций 599
функции Divide;) терпит неудачу, так как аргументу функции (соответствующему делителю) передается нулевое значение. При этом генерируется строковая исключительная ситуация, содержащая слова "Деление на ноль". Для строковых исключительных ситуаций никакой отдельный обработчик в данном случае не предусмотрен; однако имеется абсолютный обработчик, так что туда и направляется строковая исключительная ситуация.
Абсолютный обработчик перехватывает все исключительные ситуации подряд, поэтому он должен стоять в списке обработчиков последним. При компиляции листинга 22.15 вы получите сообщение об ошибке.
try {
I?rocessElements();
} catch (...){
cout « "Генерируется какая-то неизвестная исключительная ситуация. \п" «
catch (int) (
cout « "Генерируется целочисленная исключительная ситуация. \п" }
Хотя абсолютный обработчик всеяден и может обрабатывать исключительные ситуации любого типа, очевидно, что он не способен определить объект, генерирующий такую ситуацию. Даже если и был бы какой-то метод добраться до объекта по ссылке, то все равно не представляется возможным определить тип объекта. Не зная типа исключительной ситуации, сложно обработать ее сколько-нибудь разумным образом. По этой причине абсолютные обработчики обычно используются для перехвата и грубой обработки непредвиденных исключительных ситуаций.
ПОИСК обработчика. Поиск нужного обработчика, в зависимости от обстоятельств, может оказаться далеко не столь простым, как вы могли бы подумать, изучая приведенные в этом разделе примеры. Поэтому очень важно грамотно упорядочить списки обработчиков в соответствии с типами обрабатываемых ими исключительных ситуаций.
При диспетчеризации исключительных ситуаций исполняемый код С++ следует нескольким ключевым правилам. Чтобы не запутаться, читайте эти правила очень внимательно.
• Правило 1. Списки обработчиков исключительных ситуаций' просматриваются от начала до конца. Исключительная ситуация направляется в первый подходящий обработчик. Поэтому если обрабатывать исключительную ситуацию потенциально могут более одного обработчика (в силу одного из следующих правил), то она передается тому обработчику, который стоит в списке первым.