사용자 정의 예외 의 경우 여기에 설명 된 다른 답변 에 추가 하고 싶었습니다 .
std::exception
"모든 가능한"예외 유형을 발견 할 때로 부터 파생되는 사용자 정의 예외를 작성하는 경우, 항상 catch
포착 될 수있는 "가장 파생 된"예외 유형으로 절을 시작해야합니다 . 하지 말아야 할 것의 예를보십시오 :
#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;
}
노트:
0)은 적절한 순서 ie- 먼저, 반대로되어야 catch (const MyException& e)
하였다된다 catch (const std::exception& e)
.
당신이 볼 수 있듯이 같이 프로그램을 실행할 때 1), 첫 번째 캐치 절은 않았다 아마 무엇 인 (실행됩니다 NOT ) 처음에 싶었다.
2) 첫 번째 catch 절에서 잡은 유형이 유형이더라도 std::exception
"적절한"버전 what()
이 호출됩니다. 참조에 의해 잡히게됩니다 (적어도 잡힌 인수 std::exception
유형을 값으로 변경 함) . "개체 슬라이싱"현상).
3) "XXX 예외가 발생했기 때문에 일부 코드 ..."가 예외 유형과 관련하여 중요한 작업을 수행하는 경우 여기에 코드의 오작동이 있습니다.
4) 이것은 잡힌 물체가 다음 class Base{};
과 같은 "정상적인"물체 인 경우에도 관련이 있습니다 class Derived : public Base {}
.
5) g++ 7.3.0
Ubuntu 18.04.1에서 언급 된 문제를 나타내는 경고가 생성됩니다.
'void describeDerivedExceptionCatch ()'함수에서 : item12Linux.cpp : 48 : 2 : 경고 : 'MyException'유형의 예외 가 catch됩니다 (const MyException & e) ^ ~~~~
item12Linux.cpp : 43 : 2 : 경고 : 'std :: exception'catch
(const exception & e) ^ ~~~~의 이전 핸들러에서
다시 말하지만 ,이 답변은 여기에 설명 된 다른 답변 에 추가 하는 것입니다 (이 시점은 언급 할 가치가 있다고 생각했지만 의견으로는 묘사 할 수 없습니다).