
//
// To jest przykładowy kod z podrozdziału 19.5.3 „Gwarancje” książki
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include <iostream>
#include <stdexcept>
#include <vector>

using std::vector;

//------------------------------------------------------------------------------

namespace N1
{
    vector<int>* make_vec()    // Tworzy pełny wektor.
    {
        vector<int>* p = new vector<int>;    // Alokacja w pamięci wolnej.
        // … Napełnia wektor danymi. Tu może zostać zgłoszony wyjątek.
        return p;
    }
}

//------------------------------------------------------------------------------

namespace N2
{
    vector<int>* make_vec()    // Tworzy pełny wektor.
    {
        vector<int>* p = new vector<int>;    // Alokacja w pamięci wolnej.
        try {
            // Napełnia wektor danymi. Tu może zostać zgłoszony wyjątek.
            return p;
        }
        catch (...) {
            delete p;    // Lokalne czyszczenie.
            throw;       // Ponowne zgłoszenie wyjątku, aby umożliwić wywołującemu poradzenie sobie
                         // z tym, że jakaś funkcja nie była w stanie wykonać swojego zadania.
        }
    }
}

//------------------------------------------------------------------------------

int main()
try
{
    vector<int>* p = N1::make_vec();
    vector<int>* q = N2::make_vec();
    delete q;
    delete p;
}
catch (std::exception& e) {
    std::cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    std::cerr << "Ojej: nieznany wyjątek!\n"; 
    return 2;
}

//------------------------------------------------------------------------------
