SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: diego.martinez en Martes 25 de Agosto de 2009, 11:42

Título: try y object unwinding
Publicado por: diego.martinez en Martes 25 de Agosto de 2009, 11:42
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:
Título: Re: try y object unwinding
Publicado por: Eternal Idol en Martes 25 de Agosto de 2009, 12:10
http://msdn.microsoft.com/en-us/library ... 80%29.aspx (http://msdn.microsoft.com/en-us/library/xwtb73ad%28VS.80%29.aspx" onclick="window.open(this.href);return false;)
http://msdn.microsoft.com/en-us/library ... 80%29.aspx (http://msdn.microsoft.com/en-us/library/1deeycx5%28VS.80%29.aspx" onclick="window.open(this.href);return false;)

http://www.learncpp.com/cpp-tutorial/15 ... unwinding/ (http://www.learncpp.com/cpp-tutorial/153-exceptions-functions-and-stack-unwinding/" onclick="window.open(this.href);return false;)
http://publib.boulder.ibm.com/infocente ... plr155.htm (http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=/com.ibm.xlcpp8l.doc/language/ref/cplr155.htm" onclick="window.open(this.href);return false;)

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) (http://msdn.microsoft.com/en-us/library/49147z04.aspx)

Otra recomendacion seria NO usar excepciones salvo en casos EXCEPCIONALES (valga la redundancia), todo lo demas es preferible manejarlo con valores de retorno ...
Título: Re: try y object unwinding
Publicado por: diego.martinez en Miércoles 26 de Agosto de 2009, 11:19
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.
Título: Re: try y object unwinding
Publicado por: Eternal Idol en Miércoles 26 de Agosto de 2009, 11:31
De nadas  B)