#include <iostream>
using namespace std;

class A
{
public:
	A( int a )
		: _a(a)
		{ cerr << "A::A(" << _a << ")" << endl; }
	~A()
		{ cerr << "A::~A(" << _a << ")" << endl; }
		
private:
	int _a;
};

int f( int x )
{
	A a(x);
	A* p = new A(100+x);
	try	{
		if( x<0 )
			throw "Parametar funkcije f je manji od 0!";
		if( x>3)
			throw x;
		cout << "Poziv destruktora u bloku try" << endl;
		delete p;
		}
	catch(...){
		cout << "Poziv destruktora u hvatacu izuzetaka" << endl;
		delete p;
		throw;
	}
	
	return x * x;
}

void g( int a, int b)
{
	for( int i=a; i<=b; i++ ){
		try	{
			int y = f(i);
			cout << "f(" << i << ") = " << y << endl;
		}catch( char* s ){
			cerr << "GRESKA: " << s << endl;
		}
	}
}

main()
{
	cout << "pocetak" << endl;
	try	{
		g( -1, 5 );
	}catch(...){
		cerr << "Nepoznata greska!" << endl;
	}
	cout << "kraj" << endl;
	return 1;
}


/*

A::A(101)
Poziv destruktora u bloku try
A::~A(101)
A::~A(1)
f(1) = 1
A::A(2)
A::A(102)
Poziv destruktora u bloku try
A::~A(102)
A::~A(2)
f(2) = 4
A::A(3)
A::A(103)
Poziv destruktora u bloku try
A::~A(103)
A::~A(3)
f(3) = 9
A::A(4)
A::A(104)
Poziv destruktora u hvatacu izuzetaka
A::~A(104)
A::~A(4)
Nepoznata greska!
kraj

*/