![]() |
![]() |
![]() |
![]() |
![]() |
FTP | ![]() |
![]() |
CCD | ![]() |
![]() |
Buscar | ![]() |
![]() |
Trucos | ![]() |
![]() |
Trabajo | ![]() |
![]() |
Foros | ![]() |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
||||
|
||||
Gestión de errores (try/catch/finally)
Estoy hecho un verdadero lío y sé que esto es básico, pero no me aclaro. Tengo este código:
try Código:
{ char cEntornoAnt[256] = "\0"; TIniFile *fIni = new TIniFile(cEntornoAnt); GetPrivateProfileString("DATOS", "Entorno", "C:\\DatAfi21\\Gia.ini", cEntornoAnt, sizeof(cEntornoAnt), cInicio.c_str()); if (!FileExists(cEntornoAnt)) throw Exception("No se encuentra el fichero de configuracion antiguo.\nAvise al programador."); [Resto del código] } catch(Exception &exception) { ShowMessage(exception.Message); } __finally { delete cEntornoAnt; delete fIni; } Si anido otro try: Código:
try { char cEntornoAnt[256] = "\0"; TIniFile *fIni = new TIniFile(cEntornoAnt); try { GetPrivateProfileString("DATOS", "Entorno", "C:\\DatAfi21\\Gia.ini", cEntornoAnt, sizeof(cEntornoAnt), cInicio.c_str()); if (!FileExists(cEntornoAnt)) throw Exception("No se encuentra el fichero de configuracion antiguo.\nAvise al programador."); [Resto del código] } catch(Exception &exception) { ShowMessage(exception.Message); } } __finally { delete cEntornoAnt; delete fIni; } |
#2
|
|||
|
|||
Hola Angel....
mira, prueba con esta estructura Código:
void __fastcall TForm1::Button1Click(TObject *Sender) { Graphics::TBitmap* B = new Graphics::TBitmap; try { TPrinterSetupDialog *PS = new TPrinterSetupDialog(NULL); try { PS->Execute(); } catch(...) { delete PS; throw; } delete PS; B->Width = Screen->Width; B->Height = Screen->Height; } catch(...) { delete B; throw; } delete B; } Última edición por Snaked fecha: 23-11-2016 a las 17:03:39. |
#3
|
|||
|
|||
quizas sea que tienes que poner:
delete Form1->cEntornoAnt o donde este situado el identificador creo que el delete ese del Finally es redundante....pues los objetos locales de metodos y funciones se borran automaticamente por el compilador al salir de los mismos Última edición por Snaked fecha: 23-11-2016 a las 17:02:26. |
#4
|
||||
|
||||
Gracias por las respuestas. Ya encontré el error y es una tontería
![]() Código:
char cEntornoAnt[256] = "\0"; TIniFile *fIni; try { try { [...] } catch(...) { } } |
#5
|
|||
|
|||
ah claro..... yo no cai en eso pero tampoco es que sea experto en try catch....creo que solo lo habre hecho 1 o 2 veces y la primera fue en el curso de programacion de C++ builder de auto-enseñanza que hice.... jejeejej
lo que si creo que me apetece es volver a repasarme el libro de programacion en C y ahondar un poco en otro de programacion C++ y ver si ahora, con un poco mas de experiencias a las espaldas lo cojo con soltura y vicio. |
#6
|
||||
|
||||
__finally no es C++ estándar y solo funciona con los compiladores de Microsoft, por lo tanto en el c++builder no te va a funcionar. Además en tu código no lo necesitabas para nada y solo necesitabas quitarlo sin más.
Por otro lado ese código no está bien ya que si falla al obtener memoria, en tu código si o si intentará liberarla y eso es peligroso. Además cEntornoAnt es creado de forma estática e intentas liberar su memoria con delete, delete se usa para liberar la memoria obtenida con new. Así deberías ponerlo: Código PHP:
|
![]() |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
![]() |
||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Try/except/finally | jsc | OOP | 14 | 13-09-2011 19:06:14 |
Capturar Errores con Try, Finally, End | GerTorresM | OOP | 1 | 23-04-2011 23:16:01 |
Try Except --finally-- | Caral | Varios | 13 | 02-10-2006 22:12:24 |
Errorsys, o gestión de errores | dec | Trucos | 0 | 01-07-2006 12:22:43 |
Gestión Errores en DBEXPRESS | asirvent | Conexión con bases de datos | 0 | 21-11-2003 12:39:48 |
![]() |
|