Estoy casi seguro que el error esque Invalida no es accesible desde el archivo donde estas capturando la excepción... Por otro lado, deberías poner un & para capturar el objeto sin copiarlo
De todas formas no me gusta esa forma de capturar excepciones. Yo lo que hago es crear una clase génerica:
struct Excepcion
{
unsigned int N_Error; // Codigo de error, debes definir los codigos como constantes (por ejemplo: Division_Por_Cero)
std::string Mensaje;
Excepcion(std::string mensaje,int N) : Mensaje(mensaje),N_Error(N) {}
};
Con eso puedo crear excepciones de todo tipo (simplemente, pongo un mensaje y le asigno un codigo de error). No obstante, si quiero excepciones más específicas, práctico herencia:
struct Excepcion_Cadena : public Excepcion{ Excepcion_Cadena(std::string mensaje,int n):Excepcion(mensaje,n){}};
La ventaja es que excepcion_cadena también es una excepción, por lo que podría capturarse de las dos formas.