[C con Clase] try...catch...finally

Steven Davidson steven en conclase.net
Vie Mayo 18 21:11:01 CEST 2007


Hola lsri8088,

El pasado 2007-05-18 15:16:53, lsri8088 escribió:

l> En el VB .NET (y creo que tb en el Visual C++) el bloque try/catch
l> tiene un bloque finally que se ejcuta siempre, se produzca o no la
l> excepcion.
l> ¿y en C++ builder? No encuentro nada, parece que no existe. Esta el
l> __finally pero si lo pones despues de un catch no funciona (da error
l> de compilacion). En la ayuda meten un try dentro de otro. No lo
l> entiendo. ¿se hace asi?

Veamos. Bajo C++, tenemos el bloque 'try/catch'. Bajo otros lenguajes, como Java, VC.NET, y algunos otros existe la sentencia o "bloque" 'finally'. Sin embargo, bajo C++, este bloque no es necesario, ya que siempre se invocará los destructores antes de llegar a 'catch' y por supuesto antes de terminar el bloque. Por ejemplo,

try
{
  vector< int > lista;
  cout << lista.at( 40000 );  // Provocará una excepción
}
catch( out_of_range &e )
{
  // Hacer algo aquí
  ...
}

Bajo C++, no tenemos necesidad de tener un bloque 'finally' ya que no tendremos problemas de pérdida de memoria. Esto es porque al llegar al bloque 'catch', el objeto 'lista' fue destruido al llamar a su destructor automáticamente.

El problema con los otros lenguajes es que su destructor puede o no ser llamado inmediatamente, ya que tanto Java como .NET emplean un recogedor de basura (GC, en inglés). Este GC puede eliminar la memoria inmediatamente, dentro de 5 horas, 3 días, o 2 semanas. Por lo tanto, para liberar ciertos recursos, como "cerrojos" o "cierres" (locks, en inglés), se necesita alguna forma de llevar a cabo esas tareas de "limpieza". Por consiguiente, estos tipos de lenguajes SÍ necesitan un bloque 'finally'.


Si quieres usar '__finally', bajo Builer, ten presente que no es estándar. De hecho, es más bien una extensión de C, pero también funciona bajo C++. El problema que estás teniendo es que 'catch' no existe bajo C ni con la extensión ofrecida por Builder. En lugar de 'catch', se usa '__except'. Estás mezclando extensiones de Builder con el lenguaje estándar de C++. Por ello, el ejemplo de Builder requiere otro grupo de 'try' para anidar el grupo 'try' que quieres usar. Sugiero usar '__try' con '__finally' para que no haya confusiones.

Debo decir que sinceramente no he usado estas extensiones, sólo el lenguaje C++ estándar. Por lo tanto, no sé si mi solución anterior funcionará o no.


Espero que esto te sirva.

Steven


Más información sobre la lista de distribución Cconclase