Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Problema con try, __finally y catch

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Problema con try, __finally y catch Responder citando

Acá en mi trabajo me comentaron que Builder tenía un problemita con anidación de estas estructuras (no así Delphi). Hice un programita ejemplo y realmente es así!!

Por ejemplo, si tengo:

Código:

try {
   try {
      try {
         blablala;
         línea que puede dar excepción;
         return 0;
      } __finally {
         return 1;
      }
   } catch (...) {
      return 2;
   }
} __finally {
   return 3;
}


Sea que esa línea dé excepción o no, el programa siempre devuelve 1! Nunca entra en el catch ni en el finally del final.

Prueben con distintas combinaciones, con y sin excepciones, y verán que no siempre entra en los finally al terminar ni en los catch ante excepciones!

Esto es terrible! Uno descansa tranquilo en que Builder va a ejecutar los finally y que la memoria se va a liberar... pero no!!

Tengo el C++ Builder 5.0, Build 12.34, sin el update (me daba algunos problemas).

A alguien más le pasa? Alguien lo había notado?
_________________
"Todo es posible si Ud. no sabe de qué está hablando"
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola, Andrés. No entiendo muy bien qué motivos pueden llevarte a escribir un código como el que propones, pero me parece que si una función encuentra la sentencia return devolverá el control a la función que hizo la llamada, por lo que no debería ejecutarse nada más del código que el primer return 1.

En cierto modo lo veo como escribir
Código:
if (2)
   ShowMessage("Hola");
else
   ShowMessage("Adiós");
y quejarse de que nunca se despide nuestro programa, no me parece que se trate de un error del compilador (que tendrá sus errores, no lo dudo) si no más bien de una mala solución del programador. ¿O puedes justificar ese anidamiento que propones?
_________________
Ojos ... no son ojos porque los ves, son ojos porque te miran
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

El código del finally precisamente se usa para que se ejecute siempre, sí o sí, al terminar. Así uno se asegura 100% que la memoria asignada se libera (típicamente).
De hecho, en mi código puedes ver que al llegar al return 0, va al finally y ejecuta el return 1. Si no, debería devolver siempre 0.

Haz la prueba: pon un return dentro de un try, y verás cómo al llegar al return ejecuta el código del finally.

Reitero: esto en Delphi funciona bien (o sea, devuelve siempre 3).
_________________
"Todo es posible si Ud. no sabe de qué está hablando"
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Tenía entendido que no se debe colocar un return en medio del try/finally/catch ya sea esto en C++Builder, Visual c++, o cualquier compilador de C/C++.
Traduciendo tu codigo a lo que recomiendan los distintos textos sería:
Código:

int r=0;
try {
   try {
      try {
         blablala;
         línea que puede dar excepción;
      } __finally {
         r = 1;
      }
   } catch (...) {
      r = 2;
   }
} __finally {
   r = 3;
}
return r;

Espero te sirva Wink.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias! Pero sucede que yo quiero irme de la función en el medio el código... De lo contrario tengo que hacer bloques if-else grandes.
Igualmente ahora ya lo resolví así, con una variable y un solo return al final.
Tienes alguna documentación sobre eso que me comentas del return dentro de un try?
_________________
"Todo es posible si Ud. no sabe de qué está hablando"
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.