İstedim ADD durumunda, ek bir not burada açıklanan diğer cevaplara özel istisnalar .
Kendi özel kural dışı durumunuzu oluşturduğunuzda, std::exception
"tüm olası" kural dışı durum türlerini yakaladığınızda, catch
yan tümceleri her zaman yakalanabilecek "en türetilmiş" kural dışı durum türüyle başlatmalısınız . Örneğe bakın ( YAPILMAMASI için):
#include <iostream>
#include <string>
using namespace std;
class MyException : public exception
{
public:
MyException(const string& msg) : m_msg(msg)
{
cout << "MyException::MyException - set m_msg to:" << m_msg << endl;
}
~MyException()
{
cout << "MyException::~MyException" << endl;
}
virtual const char* what() const throw ()
{
cout << "MyException - what" << endl;
return m_msg.c_str();
}
const string m_msg;
};
void throwDerivedException()
{
cout << "throwDerivedException - thrown a derived exception" << endl;
string execptionMessage("MyException thrown");
throw (MyException(execptionMessage));
}
void illustrateDerivedExceptionCatch()
{
cout << "illustrateDerivedExceptionsCatch - start" << endl;
try
{
throwDerivedException();
}
catch (const exception& e)
{
cout << "illustrateDerivedExceptionsCatch - caught an std::exception, e.what:" << e.what() << endl;
// some additional code due to the fact that std::exception was thrown...
}
catch(const MyException& e)
{
cout << "illustrateDerivedExceptionsCatch - caught an MyException, e.what::" << e.what() << endl;
// some additional code due to the fact that MyException was thrown...
}
cout << "illustrateDerivedExceptionsCatch - end" << endl;
}
int main(int argc, char** argv)
{
cout << "main - start" << endl;
illustrateDerivedExceptionCatch();
cout << "main - end" << endl;
return 0;
}
NOT:
0) Uygun düzen tam tersi olmalıdır, yani önce onu catch (const MyException& e)
takip edersiniz catch (const std::exception& e)
.
Gördüğünüz gibi olduğu gibi program çalıştırdığınızda 1), birinci yakalamak fıkra sen did muhtemelen budur (yürütülecektir DEĞİL ) ilk etapta istedi.
2) İlk yakalama yan tümcesinde yakalanan tür tür olsa da, std::exception
"uygun" sürümü what()
çağrılır - çünkü başvuru tarafından yakalanır (en azından yakalanan bağımsız değişken std::exception
türünü değere göre değiştirin - ve eylemde "nesne dilimleme" fenomenleri).
3) "XXX kural dışı durumunun atılmış olmasından dolayı bazı kodların ..." kural dışı durum türüne SAYGI İLE önemli şeyler yapması durumunda, burada kodunuzun hatalı davranışı vardır.
4) Yakalanan nesneler "normal" bir nesne ise: class Base{};
ve class Derived : public Base {}
...
5) g++ 7.3.0
Ubuntu 18.04.1'de belirtilen sorunu belirten bir uyarı verir:
'Void illustrateDerivedExceptionCatch ()' işlevinde: item12Linux.cpp: 48: 2: uyarı: 'MyException' türünün istisnası catch olarak yakalanacak (const MyException & e) ^ ~~~~
item12Linux.cpp: 43: 2: uyarı: 'std :: exception'
catch için önceki işleyici tarafından (const exception & e) ^ ~~~~
Yine , bu cevabın sadece burada açıklanan diğer cevaplara EKLEMEK olduğunu söyleyeceğim (bu noktadan bahsetmeye değer olduğunu düşündüm, ancak bir yorumda tasvir edemedim).