hola gente, les hago una pregunta:

como harian lo siguiente?:

Quieren invocar una funcion f, y atrapar distintas excepciones. Al
atrapar una en particular, deciden reintentar f.
Esto suena muy sencillo, pero si escribo la invocacion a f en el scope
del catch para esa excepcion en particular, tengo que reescribir todos
los catch de las demas excepciones. La unica forma que encontre de
resolver esto es con un goto!
Estoy seguro que debe haber una forma mas elegante de resolver esto,
pero no se me ocurre.

ejemplo:

#include <iostream>
#include <exception>

using namespace std;

class e1 : public std::exception
{
public:
    virtual const char* what() const throw() { return "e1"; }
};

class e2 : public std::exception
{
public:
    virtual const char* what() const throw() { return "e2"; }
};

void f(int i)
{
    if (i == 1)
        throw e1();
    else
        throw e2();
}

int main(int argc, char** argv)
{
    int i = 1;
retry:
    try {
        f(i);
    }
    catch(const e1& e) {
        cout << e.what() << endl;
        static bool catchedOnce = false;
        i = 2;
        if (!catchedOnce) {
            catchedOnce = true;
            goto retry;
        }
    }
    catch(const e2& e) {
        cout << e.what() << endl;
    }
}

saludos,
francisco.
_______________________________________________
Lista de correo Programacion.
[email protected]
http://listas.fi.uba.ar/mailman/listinfo/programacion

Responder a