Java에서와 달리 C++는 예외처리를 필수로 여기지 않아 학교에서도 간단하게만 언급하고 넘어가는 편이다.
내가 들은 수업에선 거의 유사코드에 가까운 코드로 예시를 들었고… throw로만 예외처리를 한 코드였기 때문에 제대로 된 예외처리를 연습해볼 수 없었다.
그리고 C++에서는 STL에서 stdexception이라는 헤더를 제공해주는데, 이것으로 구현한 예외처리가 아니면 예외처리로 인정하지 않겠다는 컴파일러의 경고를 만날 수 있다. (물론 pragma disable로 무시할 수 있다.)
만약 자신만의 예외처리 클래스를 만들고 또 그것으로 예외를 처리하고 싶다면 아래와 같이 구현하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#ifndef EXCEPTION_H #define EXCEPTION_H #include <iostream> using std::ostream; #include <string> using std::string; class RuntimeException { private: string errorMsg; public: RuntimeException(const string & err) { errorMsg = err; } string getMessage() const { return errorMsg; } }; inline ostream& operator<<(ostream& out, const RuntimeException& e) { return out << e.getMessage(); } #endif |
Exception.h
모든 자식 예외처리의 부모가 되는 RuntimeException 클래스이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#ifndef TESTEXCEPTION_H #define TESTEXCEPTION_H #include <iostream> using std::ostream; #include <string> using std::string; #include "Exception.h" class TestFirstException : public RuntimeException { public: TestFirstException(const string & err) : RuntimeException(err){} }; #endif |
TestException.h
RuntimeException 클래스를 상속받은 자식 클래스를 구현해보았다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#ifndef TEST_H #define TEST_H #pragma warning(disable:4290) #include "TestException.h" class Test { public: Test(){} void func(int input) throw(TestFirstException) { try{ if (input == 1) { throw TestFirstException("TestFirstException occured"); } if (input == 0) { throw RuntimeException("Unknown Exception"); } else { std::cout << "Input: " << input << endl; } } catch (TestFirstException e) { std::cout << e << std::endl; } catch (...) { std::cout << "Unknown Exception" << std::endl; } } }; #endif // !TEST_H |
Test.h
TestFirstException 예외를 처리하는 부분이 담겨있는 메소드를 가진 Test 클래스이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> using std::cout; using std::cin; using std::endl; #include "Test.h" int main(void) { Test test; test.func(2); test.func(1); test.func(0); return 0; } |
main.cpp
드라이버 프로그램의 소스 코드이다. 아래는 실행 결과이다.