Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
Ага. Почитал MSDN. Там явно указано, что se_translator можно... 10.05.07 14:33 Число просмотров: 3019
Автор: amirul <Serge> Статус: The Elderman
|
> Даже не надейся использовать здесь (с /ЕHs) > _set_se_translator(). В VC++ 8.0 (не в VC++ 6.0) это не > работает. > Получишь warning C4535: calling _set_se_translator() > requires /EHa.
Ага. Почитал MSDN. Там явно указано, что se_translator можно ставить ТОЛЬКО при /EHa
> Здесь как минимум два варианта (на самом деле 3): > компилировать с /ЕHa
/EHa отличается от /EHs только тем, что экспепшн ожидается в любой инструкции, а не только при вызовах функций. Следовательно в общем случае чуть чаще апдейтится состояние (например, если между двумя вызовами функций сконструировано два объекта, то при /EHs это будет одно состояние и при транзишене из него во время анвинда деструктятся оба, в случае же /EHa это будет два состояния: при анвинде сначала из во втором состоянии вызовется деструктор второго объекта и будет переход в первое). Оверхед очень маленький.
> или помещать third_party_api_I_have_to_use в > __try/__except.
На мой взгляд лучше транслятор и /EHa, но если архитектура позволяет то можно и так
> Ты не сможешь установить _set_se_translator( > _My_translator_SE2CE) при компиляции с /ЕHs. Только с /ЕHа.
Ага, я уже понял. Я имел в виду С++-сные исключения вообще без деления на синхронныи и асинхронные
> Я ответил. Не генерится автоматом для /ЕHs.
Ну вообще то генерится, просто там с состояниями для раскрутки проблема. Сам же анвинд и весь обслуживающий код одинаковый для обоих типов эксепшенов (можешь скомпилировать с /FAcs и убедиться самостоятельно).
Все что выше - поскипал, ибо никаких возражений нет.
> Такой код будет работать корректно: > void foo(void) > { > int i = 0; > int filter = 1; > __try > { > bool something_wrong = true; > if (something_wrong) > { > filter = 0; > throw 1; > } > > } > __except(filter) > { > // OK. We will never be here and we will be > in the outside catch() > i = 1; > } > } > int _tmain(int argc, _TCHAR* argv[]) > { > > int i = 0; > try > { > foo(); > } > catch(...) > { > //OK > //we are overhere > int i = 1; > } > return 0; > } >
Лушче не так.
C++ эксепшены имеют две особенности:
ExceptionRecord->ExceptionCode == 0xe06d7363
и
ExceptionRecord->ExceptionInformation[0] == 0x19930520
Хотя второе необязательно. В обработчике встречал сравнение с 0x19930521 и 0x19930522, но вживую таких исключений никогда не видел. С другой стороны, хорошее регресс тестирование (и правильно расставленные assert-ы) не даст таким исключениям появиться неожиданно.
В общем если тебе не по душе /EHa и ты хочешь в __try-__except-е пропустить C++сные исключения просто делай в фильтре GetExceptionInformation и сравнивай оба magic числа или вообще так:
__try {
throw 0;
} __except (GetExceptionCode() == 0xe06d7363 ? EXCEPTION_CONTINUE_SEARCH : EXCEPTION_EXECUTE_HANDLER) {
// we will never reach here
} ---
|
|
|