Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-11-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
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 lo pongo así al compilar me da un error E2188 Expression syntax en la declaración __finally.
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;
}
Entonces el compilador me da dos errores E2451 Undefined symbol 'identifier' en los dos deletes del final. ¿Qué estoy haciendo mal?
Responder Con Cita
  #2  
Antiguo 23-11-2016
Snaked Snaked is offline
Baneado
NULL
 
Registrado: sep 2016
Posts: 102
Poder: 0
Snaked Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 23-11-2016
Snaked Snaked is offline
Baneado
NULL
 
Registrado: sep 2016
Posts: 102
Poder: 0
Snaked Va por buen camino
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.
Responder Con Cita
  #4  
Antiguo 23-11-2016
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por las respuestas. Ya encontré el error y es una tontería : Simplemente era sacar las declaraciones del try.
Código:
char cEntornoAnt[256] = "\0";
TIniFile *fIni;
     
try
{
     try
     {
          [...]
     }
     catch(...)
     {
     }
}
Responder Con Cita
  #5  
Antiguo 24-11-2016
Snaked Snaked is offline
Baneado
NULL
 
Registrado: sep 2016
Posts: 102
Poder: 0
Snaked Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 30-11-2016
Avatar de aguml
aguml aguml is offline
Miembro
 
Registrado: may 2013
Posts: 885
Poder: 11
aguml Va por buen camino
__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:
char cEntornoAnt[256] = '\0';
try
{
     
TIniFile *fIni = new TIniFile(cEntornoAnt);
     try
     {
          
GetPrivateProfileString("DATOS""Entorno""C:\\DatAfi21\\Gia.ini"cEntornoAntsizeof(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);
     }
     
delete fIni;

Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
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


La franja horaria es GMT +2. Ahora son las 22:40:24.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi