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

Единственным параметром функции set_terminate () является указатель на новый обработчик terminate о. Возвращаемое значение функции является указателем на предыдущий обработчик.

Спецификации исключительных ситуаций

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

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

В языке C++ эта проблема решается с помощью средства, названного спецификациями исключительных ситуаций (exception specifications). В сущности, спецификации позволяют программисту пометить в объявлении функции те исключительные ситуации, которые могут в ней генерироваться. Как вы можете видеть в листинге 22.22, синтаксис спецификации включает ключевое слово throw, сопровождаемое списком возможных исключительных ситуаций.

h06111.jpg

ttinclude <iostream.h>

class SimpleException { );

class Pet { »;

class Dog : public Pet { };