Vereis tengo una clase tal que asi:
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:
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 ...):
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?
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!
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í:
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...
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í:
Excepcion(string mensaje,unsigned int Error) : Mensaje(mensaje),N_Error(Error) {}; // Constructor
Funciono a la perfección, gracias!