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
  #7  
Antiguo 30-11-2016
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Poder: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Ten en cuenta que C++ usa RAII:

https://es.wikipedia.org/wiki/RAII
Cita:
La técnica RAII es vital al escribir código C++ seguro frente a excepciones
Supongo que C++ builder lo permite...
__________________
El malabarista.
Responder Con Cita
  #8  
Antiguo 30-11-2016
j0seant j0seant is offline
Miembro
 
Registrado: feb 2006
Posts: 38
Poder: 0
j0seant Va por buen camino
Cita:
Empezado por aguml Ver Mensaje
__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.
__finally existe en C++Builder desde la versión 3 o 4, y funciona (aunque sea una extensión de Microsoft). No entro en si es más o menos recomendable usarlo, evidentemente siempre que se pueda usar RAII mucho mejor.

Muy útil también para estos casos "unique_ptr" o "auto_ptr".

Última edición por j0seant fecha: 30-11-2016 a las 17:33:32.
Responder Con Cita
  #9  
Antiguo 30-11-2016
exmachina exmachina is offline
Miembro
NULL
 
Registrado: sep 2016
Ubicación: 127.0.0.1
Posts: 30
Poder: 0
exmachina Va por buen camino
Cita:
Empezado por j0seant Ver Mensaje
__finally existe en C++Builder desde la versión 3 o 4, y funciona (aunque sea una extensión de Microsoft). No entro en si es más o menos recomendable usarlo, evidentemente siempre que se pueda usar RAII mucho mejor.

Muy útil también para estos casos "unique_ptr" o "auto_ptr".
Que yo sepa el uso de los bloques try...catch..finally tienen un coste, tanto en memoria como en eficiencia, sobre todo cuando no se intercepta unas excepciones concretas-> es decir cuando se interceptan todas las excepciones y se debe desenrollar toda la pila. En internet pueden encontrarse multitud de documentos que explican esto (basicamente quiere decir que es muy comodo usar las excepciones pero repercuten en el rendimiento)

Sobre __try, __except y __finally (SEH) y cosas similares (controlar errores y excepciones en C++) en Windows :
https://msdn.microsoft.com/en-us/library/hh279678.aspx
https://msdn.microsoft.com/en-us/library/swezty51.aspx

Y por cierto, aunque no no soy programador ya se que existen documentos similares a este, pero hacen referencia a C++/CLI y aun asi sigue existiendo el mismo problema, aunque no se mencione.

Un saludo
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 08:27:50.


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