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.