예외는 프로그램 실행 중 발생하는 오류나 비정상적인 상황이다.
예외 처리는 예외가 발생했을 때 이를 처리하여 프로그램이 비정상적으로 종료 대신 안전하게 수습하는 방식
#include <iostream> #include <stdexcept> using namespace std; void riskyFunction() { throw std::runtime_error("An error occurred!"); } int main() { try { riskyFunction(); // 예외 발생 가능 } catch (const std::runtime_error& e) { std::cerr << "Caught an exception: " << e.what() << std::endl; // 예외 처리 } return 0; }
- stdexcept : C++ 표준 라이브러리에서 논리 오류(logic_error)와 런타임 오류(runtime_error)를 보고하는 표준 예외 클래스들을 정의하는 헤더 파일이다
- std::runtime_error()를 사용하여 새로운 예외 객체를 생성한다.(문자열 인자 - 예외를 처리할때 어떤 예외가 발생했는지 알릴때 사용하는 메시지)
- std::runtime_error 클래스에서 제공하는 what() 함수를 호출하면 예외 발생 시 전달된 메시지를 반환한다. 이를 통해 어떤 문제가 발생했는지 알 수 있다.
noexcept 지정자는 C++11로부터 도입된 키워드로, 함수나 연산자가 예외(exception)를 던지지 않음을 나타내는 데 사용된다.
이 키워드를 사용하여 함수 선언 앞에 붙이면, 해당 함수가 예외를 던지지 않음을 보장합니다.
noexcept로 선언된 함수는 예외를 던지지 않기 때문에 컴파일러는 더 많은 최적화를 할 수 있다.
만약 noexcept로 선언된 함수에서 예외가 발생하면, 프로그램은 즉시 종료된다.
void safeFunction() noexcept
{
std::cout << "This function is safe and will not throw." << std::endl;
}
최적화 원리
런타임 검사 코드 생략 : 컴파일러는 예외를 처리하기 위한 런타임 검사 코드(예: 예외 핸들러)를 생성하지 않아도 되므로, 코드 크기가 작아지고 실행 속도가 빨라집니다.
성능 향상
표준 라이브러리 컨테이너 - 예를 들어 vector과 같은 컨테이너는 요소를 이동할때 noexcept가 붙은 이동 생성자를 사용하여 성능을 향상시킨다.
재할당 시 예외가 발생하지 않을 것이라고 보장되므로, 더 효율적으로 메모리 이동 및 재배치를 수행할 수 있다.
noexcept로 선언된 함수에서 실제로 예외가 발생하면, std::terminate()가 호출되어 프로그램이 비정상적으로 종료된다.
따라서, 예외 발생 가능성이 없는 함수에만 신중하게 noexcept를 사용해야 한다. 예외가 발생할 수 있는 로직을 포함한 함수에서 noexcept를 사용하는 것은 매우 위험하다.