except_spec — 동적 예외 명세

except_spec — 동적 예외 명세 (Dynamic exception specification)

**동적 예외 명세(dynamic exception specification)**는 함수가 직접 또는 간접적으로 던질 수 있는 예외의 목록을 나열하는 예외 명세예요.

C++11에서 권장되지 않게(deprecated) 되었고, C++17에서 제거됐어요. 현대 C++에서는 noexcept를 사용해요.

출처: cppreference

본문

문법 (Syntax)

throw( type-id-list )    // C++11에서 deprecated, C++17에서 removed

명시적 동적 예외 명세는 함수 타입, 함수 포인터 타입, 함수 참조 타입, 또는 멤버 함수 포인터 타입에 대한 함수 선언자에만 나타날 수 있어요. 그리고 그 타입이 선언이나 정의의 최상위 타입이거나, 함수 선언자에서 매개변수 또는 반환 타입으로 나타나는 타입이어야 해요.

void f() throw(std::runtime_error);  // (오래된 문법)
void g() throw();                    // 예외를 던지지 않음 ('noexcept'와 비슷)

throw()는 예외를 던지지 않겠다는 뜻이고, C++11에서 noexcept로 대체됐어요. 나열된 타입 중 하나를 던질 수 있는 함수는 그 타입 또는 그 타입에서 파생된 타입의 예외를 던질 수 있어요.

불완전 타입, cv void*가 아닌 불완전 타입의 포인터나 참조, rvalue 참조는 동적 예외 명세에 사용할 수 없어요.

// 현대 C++ (C++11 이후)
void h() noexcept;              // 예외를 던지지 않음
void k() noexcept(false);       // 예외를 던질 수 있음

동적 예외 명세는 과거의 유물이지만, 옛 코드를 읽을 때 알아두면 도움이 돼요. 새 코드에서는 절대 쓰지 말고 noexcept 지정자를 사용해야 해요.

더 알아보기 (Learn more)

cppreference