#include <iostream.h>

//Clasa de exceptie. Se va "arunca" un obiect de acest tip.
class Error {};

//Clasa care trebuie sa esantioneze momentul
//de executie al constructorilor, respecti destructorului.
class Except
{
public:
        Except(void);
        Except(Except const &);
        ~Except();
};

Except::Except(void)
{
    cerr << "Except : constructor implicit ..." << endl;
}

Except::~Except()
{
    cerr << "Except : desctuctor ..." << endl;
}

Except::Except(Except const &Ex)
{
    //Pointer artificial, pentru a evita mesajul warning:
    //Warning! W726: col(1) no reference to formal parameter 'Ex'
    Except const *PtrE(&Ex);
    cerr << "Except : constructor de copiere ..." << endl;
}

//Functie cu doua obiecte locale de tipul Except: Ex1 si Ex2.
//Trebuie sa ne asiguram ca obiectele sunt distruse la momentul
//depasirii domeniului de existanta. Cand este depasit acest domeniu?
void ExceptFunction(Except Ex1)
{
    cerr << "ExceptFunction ..." << endl;
    Except Ex2(Ex1);
    cerr << "Imediat \"arunc\" exceptia !!!" << endl;
    throw Error();
}


void main(void)
{
    Except      E;
    try
    {
        ExceptFunction(E);
    }
    catch(Error)
    {
        cerr << "Am prins Error ..." << endl;
    }
}
