C++에서 예외 처리는 런타임 오류를 처리하는 프로세스입니다. 예외는 C++에서 런타임에 throw되는 이벤트입니다. 모든 예외는 std::exception 클래스에서 파생됩니다. 처리할 수 있는 런타임 오류입니다. 예외를 처리하지 않으면 예외 메시지를 출력하고 프로그램을 종료합니다.
예외는 C++ 표준에서 프로그램 내에서 사용할 수 있는 <예외> 클래스로 정의됩니다. 부모-자식 클래스 계층 구조의 배열은 다음과 같습니다. -
C++의 일반적인 예외 클래스는 -
시니어 번호 | 예외 및 설명 |
---|---|
1 | std::예외 이것은 모든 표준 C++ 예외의 예외이자 상위 클래스입니다. |
2 | std::bad_cast dynamic_cast에서 throw된 예외입니다. |
3 | std::bad_exception 이 예외는 C++ 프로그램에서 예기치 않은 예외를 처리하는 데 사용됩니다. |
4 | std::bad_alloc 일반적으로 new에 의해 던져집니다. |
5 | std::logic_failure 이 예외는 코드를 읽어 감지할 수 있습니다. |
6 | std::runtime_error 이 예외는 코드를 읽어서 감지할 수 없습니다. |
7 | std::bad_typeid typeid가 던진 예외입니다. |
키워드
예외 처리에는 try, catch 및 throw의 3가지 키워드가 있습니다.
차단 시도/캐치
C++에서 예외 처리는 try/catch 문을 사용하여 수행됩니다. 예외가 발생할 수 있는 코드는 Try 블록으로 배치하는 데 사용됩니다. catch 블록은 예외를 처리하는 데 사용됩니다.
예시 코드
#include <iostream> using namespace std; class Sample1 { public: Sample1() { cout << "Construct an Object of sample1" << endl; } ~Sample1() { cout << "Destruct an Object of sample1" << endl; } }; class Sample2 { public: Sample2() { int i=7; cout << "Construct an Object of sample2" << endl; throw i; } ~Sample2() { cout << "Destruct an Object of sample2" << endl; } }; int main() { try { Sample1 s1; Sample2 s2; } catch(int i) { cout << "Caught " << i << endl; } }
출력
Construct an Object of sample1 Construct an Object of sample2 Destruct an Object of sample1 Caught 7
사용자 정의 예외
예외 클래스 기능을 상속 및 재정의하여 자체 예외를 정의할 수 있습니다.
예시 코드
#include <iostream> #include <exception> using namespace std; struct DivideByZero : public exception { const char * what () const throw () { return "My Exception"; } }; int main() { try { throw DivideByZero(); } catch(DivideByZero& e) { cout << "Exception caught" << endl; cout << e.what() << endl; } catch(exception& e) { } }
출력
Exception caught My Exception what() = A public method provided by exception class and it has been overridden by all the child exception classes. It returns the cause of an exception.