• Jueves 2 de Mayo de 2024, 05:56

Autor Tema:  try y object unwinding  (Leído 1342 veces)

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
try y object unwinding
« en: Martes 25 de Agosto de 2009, 11:42 »
0
Buenas:

estoy teniendo un problema con el object unwinding

tengo una seccion __try __except

que usa EHsc para hacer el StackWalk.
Todo ha ido siempre bien, pero hoy he descubierto que tiene problemas con el polimorfismo.

si hago:

Código: C++
  1.  
  2. class CA
  3. {
  4. public:
  5.     CA() {}
  6.     virtual ~CA(){}
  7. };
  8.  
  9. class CB : public CA
  10. {
  11. public:
  12.     CB() {}
  13.     ~CB(){}
  14. };
  15.  
  16. int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinst, LPSTR cmdline, int cmdshow)
  17. {
  18.     __try
  19.     {
  20.         CA * a=new CB(); //aqui me da el fallo
  21.     }
  22.     __except (ExpFilter("principal",GetExceptionInformation(), GetExceptionCode(),__LINE__,__FUNCTION__)){}
  23.  
  24.     return 0;
  25. }
  26.  
  27. long _stdcall ExpFilter(char *Message,EXCEPTION_POINTERS* pExp, DWORD dwExpCode,int line,char * func)
  28. {
  29.     GStackWalk sw;
  30.     [...] //stack walk code
  31.  
  32. return EXCEPTION_EXECUTE_HANDLER; //esto hace que acepte la excepcion , si devolvemos 0 , la gestiona windows
  33. }
  34.  
  35.  

al ser CB una clase polimorfica me tira el error:
 Cannot use __try in functions that require object unwinding

compilo con la opcion /EHsc para activar las excepciones estructuradas de windows, lo que hace que no pueda resolver este caso. (cualquier otro lo hace bien)

Alguien puede explicarme que ocurre?
y que es exactamente el unwinding?

gracias por adelantado :good:

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: try y object unwinding
« Respuesta #1 en: Martes 25 de Agosto de 2009, 12:10 »
0
http://msdn.microsoft.com/en-us/library ... 80%29.aspx
http://msdn.microsoft.com/en-us/library ... 80%29.aspx

http://www.learncpp.com/cpp-tutorial/15 ... unwinding/
http://publib.boulder.ibm.com/infocente ... plr155.htm

Recomendacion, no lanzar excepciones en un constructor de esa manera podrias utilizar SEH en esa funcion usando (obviamente no capturaria nada del constructor pero si de otros miembros por ejempl):
__declspec(nothrow)

Otra recomendacion seria NO usar excepciones salvo en casos EXCEPCIONALES (valga la redundancia), todo lo demas es preferible manejarlo con valores de retorno ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

diego.martinez

  • Miembro MUY activo
  • ***
  • Mensajes: 297
    • Ver Perfil
Re: try y object unwinding
« Respuesta #2 en: Miércoles 26 de Agosto de 2009, 11:19 »
0
gracias! ahora entiendo mejor cual es el problema.

La solución que he puesto es meterlo todo en una funcion a parte.
Esto hace que pueda hacer mejor el unwinding y no me da el fallo, manteniendo la funcionalidad que queria.

nos vemos!

PD: realmente no uso nunca excepciones. Siempre verifico los returns. Lo que tengo es un try catch global en cada hilo, para que si se da una excepcion que no haya tenido en cuenta (buffer overrun, un paseo por un  puntero nulo...) la capture el StackWalker y me traze el fallo hasta la función.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: try y object unwinding
« Respuesta #3 en: Miércoles 26 de Agosto de 2009, 11:31 »
0
De nadas  B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.