Глава 22. Обработка исключительных ситуаций 589
Предположим, что экземпляр класса MyMemoryHogciass размещен динамически (и занимает в куче изрядное количество места); при вызове деструктора он эту память освобождает. Но если произойдет ошибка и выполнится longjmp, то объект Hog никогда не будет уничтожен, что приведет к утечке памяти.
Итак, нам нужна такая стратегия обработки ошибок, которая сочетала бы в себе выразительность setjmp/longjmp с учетом специфики объектно-ориентированных программ в смысле корректного уничтожения экземпляров объектов при выходе их из области видимости. Всего этого — и даже большего — можно достичь с помощью механизма обработки исключительных ситуаций.
Лучший способ — это исключительные ситуации
На первый взгляд кажется, что обработка исключительных ситуаций очень похожа на использование пары функций setjmp/longjmp, но вы быстро убедитесь, что это средство намного более сильнодействующее. Главным образом обработка исключительных ситуаций призвана ликвидировать многие недостатки вышеупомянутых стратегий обработки ошибок, значительно добавляя при этом гибкости и дополнительных функциональных возможностей.
При обработке исключительных ситуаций у программ нет иного выбора, кроме как реагировать на ошибки. Как уже упоминалось при обсуждении функций setjmp/longjmp, это увеличивает надежность программ, предохраняя их от непредвиденных проблем.
Обработка исключительных ситуаций позволяет программам использовать для представления информации об ошибке любой объект C++ базового или производного типа. Поэтому вам не нужно связываться с многочисленными кодами ошибок (если вы сами этого не хотите); вместо этого вы можете создавать иерархии специализированных классов, предназначенные исключительно для передачи информации об аварийных событиях.
Наконец, обработка исключительных ситуаций органично встроена в язык C++. Если генерация исключительной ситуации приводит к выходу локальных объектов за пределы области видимости, то вы можете быть уверены в том, что соответствующие деструкторы будут вызваны.
Основы обработки исключительных ситуаций
Теперь, когда вы поняли суть проблем, с которыми связана обработка исключительных ситуаций, самое время рассмотреть, как использовать исключительные ситуации в Borland C++. Давайте внимательно разберемся в лис-