C++은 문법적으로 예외처리를 지원한다.
throw std::out_of_range("ERROR: Out of range\n");
throw를 입력하고 예외로 전달할 객체를 입력해주면 간단하게 예외 처리가 가능하다. <stdexcept>에 out_of_range, overflow_error, length_error, runtime_error등이 정의되어 있다.
이러한 예외는 try catch문으로 잡을 수 있다.
try {
data = vec.at(index);
} catch (std::out_of_range& e) {
std::cout << "예외 발생 ! " << e.what() << std::endl;
}
// 예외가 발생하지 않았다면 3을 이 출력되고, 예외가 발생하였다면 원래 data 에
// 들어가 있던 0 이 출력된다.
std::cout << "읽은 데이터 : " << data << std::endl;
}
예외가 throw되면 가장 가까운 catch문에서 예외를 처리하게 된다.
어떠한 예외 객체가 던져지더라도 받는 방법은 다음과 같다.
try {
f(a);
}
catch(...) {
// 예외처리 코드..
}
예외를 받지 않는 함수 noexcept
어떠한 함수 뒤에 noexcept를 붙이게 되면 그 함수는 예외처리를 하지 않는다.
int func(int a) noexcept {
// 함수 로직
}
해당 함수 안에서 예외가 발생할 경우 예외 처리 루틴으로 점프하는 것이 아닌 바로 프로그램이 종료되게 된다.
예외 사용 시 주의사항
C++ 11부터 소멸자들은 모두 noexcept이므로 소멸자에서는 절대 예외를 던지지 말 것.
일반적으로 예외 객체들은 std::exception을 상속받는 것이 좋음. 표준 라이브러리의 nested_exception등 유용한 함수를 활용할 수 있게 해준다.
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ 11 / move함수 (0) | 2023.02.15 |
---|---|
C++ 11 / Rvalue 참조 (0) | 2023.02.15 |
STL 알고리즘 / find, find_if, any_of, all_of (0) | 2023.02.14 |
STL 알고리즘 / transform 함수 (0) | 2023.02.14 |
STL 알고리즘 - 원소 제거(remove, remove_if) (0) | 2023.02.14 |
댓글