Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows


Исключения С++ и структурные исключения - часть 2


rihter25-12.jpg

Заметьте также, что при выталкивании исключения С++ всегда используется флаг EXCEPTION_NONCONTINUABLE. Исключения С++ не разрешают возобновлять выпол нение программы, и возврат EXCEPTION_CONTINUE_EXECUTION фильтром, диагно стирующим исключения С++, был бы ошибкой. Если Вы посмотрите на фильтр _except в функции справа, то увидите, что он возвращает только EXCEPTION_EXECUTE_HAND LER или EXCEPTION_CONTINUE_SEARCH.

Остальные аргументы RaiseException используются механизмом, который факти чески выталкивает (throw) указанную переменную. Точный механизм того, как дан ные из переменной передаются RaiseExceplion, не задокументирован, но догадаться о его реализации в компиляторе нс так уж трудно.

И последнее, о чем хотелось бы сказать Назначение фильтра __except — сравни вать тип throw-переменных с типом переменной, используемой в С++-операторе catch. Если их типы совпадают, фильтр возвращает EXCEPTION_EXECUTE_HANDLER, вызы вая выполнение операторов в блоке catch (_except) А если они нс совпадают, фильтр возвращает ЕХСЕРТION_СОМTINUE_SЕАRСНдля проверки "вышестоящих" подереву вызовов фильтров catch.

NOTE:
Так как исключения С++ реализуются через SEH, оба эти механизма можно ис пользовать в одной программе. Например, я предпочитаю передавать физичес кую память при исключениях, вызываемых нарушениями доступа Хотя С++ во обще не поддерживает этот тип обработки исключений (с возобновлением вы полнения), он позволяет применять SEH в тсх местах программы, где это нуж но, и Ваш фильтр _except может возвращать EXCEPTION_CONTINUE_EXECU TION Ну а в остальных частях исходного кода, где возобновление выполне ния после обработки исключения нс требуется, я пользуюсь механизмом об работки исключений, предлагаемым С++.




Начало  Назад  Вперед



Книжный магазин