Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
[C++] Я в общем не понял вопроса, но в exception-ах разбираюсь неплохо 09.05.07 06:09 Число просмотров: 3218
Автор: void <Grebnev Valery> Статус: Elderman
|
Спасибо за ответ.
>Я в общем не понял вопроса,...
>> (kenguru?) говорят, мол компилируй только с /EHa.
>Компилируй с /EH :-)
VC++ 8.0, kомпилирую с /ЕHs (по дефолту):
try { int *i = 0; *i = 1; }
catch(...) { std::cout << "we will never be here."; }
Считай, что здесь, в try:
void third_party_api_I_have_to_use(void)
{
int *i = 0;
*i = 1;
}
Даже не надейся использовать здесь (с /ЕHs) _set_se_translator(). В VC++ 8.0 (не в VC++ 6.0) это не работает.
Получишь warning C4535: calling _set_se_translator() requires /EHa.
Даже хуже. Всё скомпилируется и рухнет при выполнении.
Здесь как минимум два варианта (на самом деле 3): компилировать с /ЕHa
или помещать third_party_api_I_have_to_use в __try/__except.
>>Чего то не того. __CxxFrameHandler проверяет по сигнатурам является ли >>exception C++сным и если нет, то вызывает se_translator (если он был установлен).
Ты не сможешь установить _set_se_translator( _My_translator_SE2CE) при компиляции с /ЕHs. Только с /ЕHа.
>>А этот самый __CxxFrameHandler устанавливается хэндлером для try-catch блоков >>и генерится автоматом.
Я ответил. Не генерится автоматом для /ЕHs.
>>В принципе, если ты отловил в __except исключение, которое брошено через >>throw, то в принципе нет нормального способа превратить его обратно в CE.
1) B __except я не ловлю исключений, брошенных через throw. Там я ловлю Win32 SE.
Другое дело, что любое исключение, в том числе и программное (throw) будет попадать в __except, если не правильно уцтановить фильтр __except.
Например, такой код не будет работать:
void foo(void)
{
int i = 0;
__try
{
bool something_wrong = true;
if (something_wrong)
throw 1;
}
__except(1)
{
//we will always be here and never in the outside catch()
i = 1;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0;
try
{
foo();
}
catch(...)
{
//we will anever be here :(
int i = 1;
}
return 0;
}
Такой код будет работать корректно:
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;
}
2) Из __except ты можешь нормально и легально throw C++ CE.
>>Ловить надо в try-catch, а установленный se_translator (который при >>необходимости будет вызван обработчиком фрейма) должен перебросить SE в виде >>CE (вот здесь двойной оверхэд и по памяти и по времени обработки).
Об этом и речь. Но только вначале надо транслировать SE 2 C++.
|
|
|