Örvitinn

Smá trix meğ exceptions í C++

Ég rakst á şetta C++ exception trix fyrir tilviljun á vefnum um daginn og langar ağ skrifa örlítiğ um şağ, man ekki hvar ég sá şetta. Kannski hefği ég átt ağ vera búinn ağ læra şetta fyrir löngu og hugsanlega vita allir almennilegir C++ forritarar af şessu nú şegar.

Exceptions í C++ eru höndlağar meğ try-catch klausum.

void foo() {
    try {
        sull()
    }
    catch(const std::exception& ex)
    {
        cout << ex.what() << endl;
    }
}

Eins og sést er şetta tiltölulega einfalt, ef falliğ sull sendir frá sér exception sem erfir frá std::exception er hún gripin og prentuğ út. Venjulega myndi mağur gera eitthvağ örlítiğ meira, en şetta er bara trivial sınidæmi. Şetta getur mağur gert í öllum föllum, operatorum eğa smiğum. Mağur şarf ekki ağ senda tilvik af klösum sem exceptions í C++ og í dæmunum hér fyrir neğan notast ég einfaldlega viğ strengi.

Trixiğ sem ég sá um daginn felst í şví ağ hægt er ağ setja try-catch út fyrir falliğ, ş.e.a.s. şetta er löglegur C++ kóği.

void foo() 
try
{
    sull()
}
catch(const std::exception& ex)
{
   cout << ex.what() << endl;
}

Meğ şessari ağferği getum viğ gripiğ exceptions sem viğ gætum annars ekki gripiğ, t.d. exceptions frá default handlerum í smiğ member breyta og şess háttar.

class Foo
{
public:
    Foo() { throw std::string("aarrgghhh");}
    Foo(int i) { throw std::string("arrgght, 2");}
    Foo(const std::string str) {;}  // einn smiğur sem ekki klikkar
};

class Sull 
{
public:
    Sull();
    Sull(int);
    ~Sull();
private:
    Foo f; // sjálfkrafa er kallağ á smiğ fyrir Foo şegar tilvik af Sull er smíğağ
};


// "venjuleg útfærsla á smiğ - exception er kastağ
// "şegar member breytan er smíğuğ en villan er
// "ekki gripin hér, şarsem member breytan er smíğuğ
// "áğur en fariğ er inn í şennan smiğ.
Sull::Sull()
{
	try
	{
		cout << "Sull::Sull()" << endl;
	}
	catch(const std::string& villa)
	{
		cout << villa << endl;
	}
}

// try - catch utan um smiğinn - villan er gripin og höndluğ hér
// şar sem try -catch nær líka utan um şegar member breytan er smíğuğ
Sull::Sull()
try
{
	cout << "Sull::Sull()" << endl;
}
catch(const std::string& villa)
{
	cout << villa << endl;
}

// try - catch utan um smiğinn - kallağ á smiğ fyrir member breytu
// áğur en fariğ er inn í şennan smiğ
Sull::Sull(int i)
try
: f(i)
{
	cout << "Sull::Sull()" << endl;
}
catch(const std::string& villa)
{
	cout << villa << endl;
}

Sull::~Sull()
try
{
}
catch(const std::string& villa)
{
    cout << villa << endl;
}

Reyndar hunsar Visual Studio exceptions sem er kastağ úr destructor, enda er engin einföld leiğ til ağ höndla slíkt tilvik, şar sem şağ getur gerst şegar veriğ er ağ vinda ofan af stakknum eftir ağra exception. Skemmtilegt, ekki satt ?

c++