Problema con las excepciones

Iniciado por amchacon, 27 Enero 2013, 12:24 PM

0 Miembros y 1 Visitante están viendo este tema.

amchacon

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?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

avesudra

#1
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!
Regístrate en

naderST

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...

amchacon

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!
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar