Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: amchacon en 27 Enero 2013, 12:24 PM

Título: Problema con las excepciones
Publicado por: amchacon en 27 Enero 2013, 12:24 PM
Vereis tengo una clase tal que asi:

Código (cpp) [Seleccionar]
using namespace std;

class Rar_File_Mising
{
private:
   ifstream Lectura;
   ofstream Escritura;
   // Demas metodos y variables...

public:
   // Constructor
    Rar_File_Mising(const char* Nombre,bool Opcion);

   //Metodos

   string ListarArchivos();

   void Generar(const char* Nombre,vector<unsigned int> Numero);

  //...

  // Excepciones...

   struct Excepcion
   {
       unsigned int N_Error; // Codigo de error
       string Mensaje; // Mensaje de error

       Excepcion(string mensaje,unsigned int Error) : Mensaje(Mensaje),N_Error(Error) {}; // Constructor
   };

   // Destructor

   ~Rar_File_Mising();

};


Como veis, he definido una estructura para definir las excepciones que me puedan ocurrir. De forma que si ocurre algo inesperado:

Código (cpp) [Seleccionar]
if (!Lectura.is_open())
       throw Excepcion("No hay ningun fichero abierto",ARCHIVO_NO_ABIERTO);


El problema esque no me las coge nunca en el bloque catch (ni siquiera en el bloque ...):

Código (cpp) [Seleccionar]
try
{
  Rar_File_Mising Nuevo(Nombre.c_str(),Opcion);
  cout<<Nuevo.ListarArchivos();
}
catch(Rar_File_Mising::Excepcion &E)
{
   cout<<E.Mensaje<<endl;
}
catch(...)
{
     cout<<"???";
}


¿Que es lo que puede pasar? Me acabo de cambiar al codeblocks hace poco, tengo que activar algo para que me admita las excepciones?
Título: Re: Problema con las excepciones
Publicado por: avesudra en 27 Enero 2013, 13:15 PM
Olvidalo , no se porque pasa :/ . Por codeblocks no creo que sea.
Aviso que no entiendo muy bien el uso de las sentencias try , catch y throw, pero digamos que throw tiene que lanzar algo ¿no? cuando en throw haces:
throw Excepcion("No hay ningun fichero abierto",ARCHIVO_NO_ABIERTO);
Pero esa función(constructor) solo le da valores a una estructura ya creada pero tú llamas al constructor sin estructura o eso parece no se.Fíjate aquí:
http://publib.boulder.ibm.com/infocenter/lnxpcomp/v8v101/index.jsp?topic=%2Fcom.ibm.xlcpp8l.doc%2Flanguage%2Fref%2Fcplr153.htm
Me parece a mi que eso habría que ponerlo así:
if (!Lectura.is_open())
   {
       Excepcion excepcion;
       excepcion.Excepcion("No hay ningun fichero abierto",ARCHIVO_NO_ABIERTO);
       throw excepcion;
   }
Igual la estoy liando no sé.

¡Un saludo!
Título: Re: Problema con las excepciones
Publicado por: naderST en 28 Enero 2013, 00:22 AM
Código (cpp) [Seleccionar]
Excepcion(string mensaje,unsigned int Error) : Mensaje(Mensaje),N_Error(Error) {}; // Constructor

En esta linea deberías pasarle al constructor de Mensaje "mensaje" en minúscula. Quedando así:

Código (cpp) [Seleccionar]
Excepcion(string mensaje,unsigned int Error) : Mensaje(mensaje),N_Error(Error) {}; // Constructor

Además de eso, estás validando que lance la excepción? es decir, que no está abierto el archivo...
Título: Re: Problema con las excepciones
Publicado por: amchacon en 28 Enero 2013, 14:50 PM
Cita de: naderST en 28 Enero 2013, 00:22 AM
Código (cpp) [Seleccionar]
Excepcion(string mensaje,unsigned int Error) : Mensaje(Mensaje),N_Error(Error) {}; // Constructor

En esta linea deberías pasarle al constructor de Mensaje "mensaje" en minúscula. Quedando así:

Código (cpp) [Seleccionar]
Excepcion(string mensaje,unsigned int Error) : Mensaje(mensaje),N_Error(Error) {}; // Constructor
Funciono a la perfección, gracias!