본문 바로가기
프로그래밍 언어/C++

C++ 문법 / 예외

by Nighthom 2023. 2. 15.

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등 유용한 함수를 활용할 수 있게  해준다. 

댓글