예외(Exception)는 프로그램 실행 중에 발생할 수 있는 예기치 못한 오류나 비정상적인 상황을 의미한다. 예외 처리는 이러한 상황이 발생했을 때 프로그램이 비정상 종료되지 않도록 적절히 처리하는 방법을 제공하는 것이다.
try-catch 블록을 사용하여 구현한다.
try {
// 예외가 발생할 수 있는 코드
} catch (예외 타입 변수) {
// 예외 처리 코드
}
예시
#include <iostream>
using namespace std;
int main() {
int a = 10, b = 0;
try {
if (b == 0) {
throw "0으로 나눌 수 없습니다."; // 예외 발생
}
cout << "결과: " << a / b << endl;
} catch (const char* e) { // 예외 처리
cout << "예외 발생: " << e << endl;
}
return 0;
}
출력 결과
예외 발생: 0으로 나눌 수 없습니다.
try 블록에서 예외가 발생할 수 있는 코드를 실행한다.throw 키워드를 사용하여 예외를 넘긴다.catch 블록에서 예외를 받아서 처리한다.throw는 예외를 발생한 것을 알려주는 역할을 한다.throw 값;
throw 객체;
예시
throw 10; // 정수 예외 던지기
throw "오류 발생"; // 문자열 예외 던지기
throw exception(); // 예외 객체 던지기
catch 블록은 예외를 받아서 처리한다.try 블록에 여러 개의 catch 블록을 사용할 수 있다.catch 블록은 서로 다른 예외 타입을 처리할 수 있다.예시
try {
throw 10; // 정수 예외 발생
} catch (int e) {
cout << "정수 예외 발생: " << e << endl;
} catch (const char* e) {
cout << "문자열 예외 발생: " << e << endl;
}
특정 타입의 예외뿐만 아니라 모든 예외를 처리하고 싶다면 catch(...)를 사용할 수 있다.
try {
throw "예외 발생!";
} catch (...) { // 모든 예외 처리
cout << "알 수 없는 예외 발생!" << endl;
}
표준 예외 외에도 사용자 정의 예외 클래스를 만들어 사용할 수 있다.
예시
#include <iostream>
#include <exception>
using namespace std;
class MyException : public exception {
public:
const char* what() const noexcept override {
return "사용자 정의 예외 발생!";
}
};
int main() {
try {
throw MyException(); // 사용자 정의 예외 던지기
} catch (MyException& e) {
cout << e.what() << endl;
}
return 0;
}
출력 결과
사용자 정의 예외 발생!
C++ 표준 라이브러리에서는 다양한 예외 처리를 위해 표준 예외 클래스를 제공합니다.
| 예외 클래스 | 설명 |
|---|---|
std::exception | 모든 표준 예외의 기본 클래스 |
std::invalid_argument | 잘못된 인자를 전달했을 때 발생하는 예외 |
std::out_of_range | 범위를 벗어난 경우 발생하는 예외 |
std::overflow_error | 산술 연산 오버플로우가 발생했을 때 발생하는 예외 |
std::underflow_error | 산술 연산 언더플로우가 발생했을 때 발생하는 예외 |
std::runtime_error | 런타임 오류가 발생했을 때 발생하는 예외 |
프로그램의 비정상 종료 방지
예외 처리를 통해 예기치 않은 상황이 발생하더라도 프로그램이 종료되지 않고 정상적으로 동작하도록 할 수 있다.
오류 원인 파악 용이
예외 처리를 사용하면 오류가 발생한 지점을 명확히 알 수 있어 디버깅이 용이하다.
안정성 향상
프로그램의 안정성을 높이고 사용자에게 올바른 오류 메시지를 제공할 수 있다.