Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: DraKKaR en 03 de Enero de 2004, 08:25:18 PM

Título: Exceptiones Y C++
Publicado por: DraKKaR en 03 de Enero de 2004, 08:25:18 PM
 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.
Título: Exceptiones Y C++
Publicado por: ethernet en 04 de Enero de 2004, 11:38:33 AM
 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
Título: Exceptiones Y C++
Publicado por: DraKKaR en 04 de Enero de 2004, 02:16:22 PM
 Umm.. la verdad es que me gusta la solución del template, lo probaré a ver que tal. Gracias!
Título: Exceptiones Y C++
Publicado por: ethernet en 04 de Enero de 2004, 07:04:55 PM
 Pero la solucion del template solo sirve para ciertas funciones y si le tienes q pasar parametros a la funcion olvidate.

saludos
Título: Exceptiones Y C++
Publicado por: DraKKaR en 04 de Enero de 2004, 07:32:30 PM
 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?
Título: Exceptiones Y C++
Publicado por: ethernet en 04 de Enero de 2004, 08:37:31 PM
 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
Título: Exceptiones Y C++
Publicado por: DraKKaR en 05 de Enero de 2004, 11:06:34 AM
 Gracias, seguiré ambos consejos, a ver cua es el que más me interesa.