| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Andrés Lt JG


Registrado: 30 Ago 2002Mensajes: 62Ubicación: Ramos Mejía
|
Publicado: Mar 05 Abr, 2005 2:27 pm Asunto: Problema con try, __finally y catch |
|
|
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 |
|
 |
Enrique Master


Registrado: 13 Ago 2002Mensajes: 261Ubicación: La Vila Joiosa (Alacant)
|
Publicado: Mar 05 Abr, 2005 3:59 pm Asunto: |
|
|
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 |
|
 |
Andrés Lt JG


Registrado: 30 Ago 2002Mensajes: 62Ubicación: Ramos Mejía
|
Publicado: Mar 05 Abr, 2005 4:22 pm Asunto: |
|
|
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 |
|
 |
cecito Capt

Registrado: 25 Nov 2003Mensajes: 164Ubicación: Arequipa - Perú
|
Publicado: Mar 05 Abr, 2005 5:47 pm Asunto: |
|
|
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 . |
|
| Volver arriba |
|
 |
Andrés Lt JG


Registrado: 30 Ago 2002Mensajes: 62Ubicación: Ramos Mejía
|
Publicado: Mar 05 Abr, 2005 6:36 pm Asunto: |
|
|
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 |
|
 |
|