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 지정자를 사용해야 해요.