Глава 22. Обработка исключительных ситуаций_______________________673

Что случится, если функция нарушит свою собственную спецификацию исключительных ситуаций? Запустив программу, приведенную в листинге 22.22, вы обнаружите, что она выводит на экран сообщение "Перехвачена Pet!" и затем аварийно завершается. Такое завершение вызывается функцией, называемой неожиданным (unexpected) обработчиком. Когда функция или метод генерируют исключительную ситуацию, не описанную в спецификации исключительных ситуаций, выполняется неожиданный обработчик. В Borland C++ 5 неожиданный обработчик по умолчанию просто выводит на экран сообщение о завершении и останавливает программу. В следующем разделе "Ожидание неожиданного" подробно рассматривается, как вы можете задать собственный неожиданный обработчик.

Итак, спецификации исключительных ситуаций действительно помогают решить некоторые проблемы, о которых шла речь в начале этого раздела. Они действительно обеспечивают программиста своеобразной картой, описывающей изгибы и повороты, скрытые в дебрях чужого исходного кода. Однако имеется несколько серьезных ловушек, связанных со спецификациями исключительных ситуаций.

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

Ожидание неожиданного

Как упоминалось в предыдущем разделе, неожиданный обработчик вызывается всякий раз, когда программа генерирует исключительную ситуацию, не описанную в спецификации исключительных ситуаций. Так же как и обработчик terminate (), обработчик unexpected () позволяет перед завершением программы выполнить какие-то действия. Однако в отличие от обработчика завершения, неожиданный обработчик может сам генерировать исключительные ситуации. Это дает вашей программе второй шанс на жизнь; можно