Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Exceptiones Y C++

Iniciado por DraKKaR, 03 de Enero de 2004, 08:25:18 PM

« anterior - próximo »

DraKKaR

 Bueno, a ver tomo resolveríais estos los gurús de C++. :P

tengo una función, donde lanzo una excepción:


void putear(void)
{
throw 0;
}


Ahora quiero hacerme una macro para capturar esa excepción fuera de la función. Del estilo:


main(void)
{
if (HAYERROR(putear()))
        print("Puteado!");
}


Había pensado hacer esa macro de la siguiente forma:

#define HAYERROR(x) try{ x; return false; }catch(int){ return true; }


En teoría eso debería funcionar. Se ejecutará el pedazo de código x; si no ocurre nada devolverá false (no hay error), y si hay un error, se capturará la excepción en el catch y devovlerá true. Bien, en teoria estaba todo claro. Pero al compilar me dice que hay un error en la linea:
if (HAYERROR(putear()))
el error dice que no se esperaba la palabra clave try dentro de un 'if' para ser evaluado.


¿Alguno sabe comos e podría hacer algo como lo que rpetendo?

PD: Podria solucionarse si en vez de macro, lo hiciera como una función que devuelve un booleano. Pero no creo que se le pueda pasar a una función un bloque de código como parámetro.

ethernet

 Se me ocurren dos soluciones:

la primera con templates pero muy poco flexible. Estoy seguro q dandole vueltas y usando TYPELIST (mas info en modern c++ design) se podria conseguir hacer lo mismo pero para cualquier funcion.


template <void (*T)()>
class exp
{
public:

bool Value()
{
 try
 {
  T();
  return false;
 
 }
 catch(int)
 {
  return true;
 }

}
};

void f()
{
throw 0;
}


#define HAYERROR(x) exp<x>().Value()

int main(int argc, char* argv[])
{
if(HAYERROR(f))
{

}
return 0;
}


Y la otra solucion cutre von macros (no la he probado):


#define IF_TRY(x) \
 try {\
 x; \
}catch(int)

void main()
{
IF_TRY(f())
{
    std::cout << "WEEEEEEEEEEEEE";
}
}



saludos

DraKKaR

 Umm.. la verdad es que me gusta la solución del template, lo probaré a ver que tal. Gracias!

ethernet

 Pero la solucion del template solo sirve para ciertas funciones y si le tienes q pasar parametros a la funcion olvidate.

saludos

DraKKaR

 Hombre, el que solo puedas usarlo para funciones no es una restricción en sí misma, lo acepto. Y el que no peudas pasarle parámetros a las funciones... no entiendo mucho de templates, pero ¿no se podría hacer que aceptara cualquier tipo de funciones?

ethernet

 Si, busca informacion acerca de typelist, aunque te advierto que no es nada obvio y que si no tienes soltura con templates te sera dificil entenderlo. Te recomiendo modern c++ design en la que hay una explicacion detalladisima de typelist.
Si quieres una solucion rapida usa la segunda opcion que te he pasado que creo q funciona.


saludos

DraKKaR

 Gracias, seguiré ambos consejos, a ver cua es el que más me interesa.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.