Namespaces
Variants

std::uncaught_exception, std::uncaught_exceptions

cppreference.net에서
 
 
 
헤더에 정의됨 <exception>
bool uncaught_exception() throw();
(1) (C++11까지)
bool uncaught_exception() noexcept;
(C++11부터)
(C++17에서 폐기됨)
(C++20에서 제거됨)
int uncaught_exceptions() noexcept;
(2) (C++17부터)
(C++26부터 constexpr)
1) 현재 스레드에 활성 예외 객체가 있는지, 즉 예외가 발생되었거나 다시 던져졌지만 아직 일치하는 catch 절에 진입하지 않았는지 감지합니다. std::terminate 또는 std::unexpected. 즉, std::uncaught_exception 감지합니다: 스택 되감기가 현재 진행 중인지
2) 현재 스레드에서 발생되었거나 다시 던져졌지만 아직 자신의 일치하는 catch 절에 진입하지 않은 예외의 개수를 감지합니다.

때로는 예외를 던져도 안전한 경우가 있습니다. std::uncaught_exception() == true(C++17까지) std::uncaught_exceptions() > 0(C++17부터). 예를 들어, 스택 되감기로 인해 객체가 소멸되는 경우, 해당 객체의 소멸자는 예외를 던지는 코드를 실행할 수 있지만, 예외가 소멸자를 벗어나기 전에 어떤 catch 블록에 의해 포착되어야 합니다.

반환값

1) true 만약 현재 이 스레드에서 스택 풀기가 진행 중인 경우, false 그렇지 않은 경우.
2) 현재 스레드에서 처리되지 않은 예외 객체의 수.

참고 사항

uncaught_exceptions 가 int를 반환하는 예시로 boost.log 라이브러리가 있습니다: 표현식 BOOST_LOG ( logger ) << foo ( ) ; 는 먼저 가드 객체를 생성하고 생성자에서 처리되지 않은 예외의 수를 기록합니다. 출력은 foo ( ) 가 예외를 발생시키지 않는 한 가드 객체의 소멸자에 의해 수행됩니다 (만약 foo()가 예외를 발생시키는 경우, 소멸자에서 처리되지 않은 예외의 수가 생성자에서 관찰된 값보다 많아집니다).

std::experimental::scope_fail 와 std::experimental::scope_success 는 LFTS v3에서 uncaught_exceptions 의 기능에 의존합니다. 왜냐하면 이들의 소멸자들은 스택 풀기 중에 호출되는지 여부에 따라 달라지는 서로 다른 작업을 수행해야 하기 때문입니다.

기능 테스트 매크로 값 표준 기능
__cpp_lib_uncaught_exceptions 201411L (C++17) std::uncaught_exceptions
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr 예외 타입

예제

#include <exception>
#include <iostream>
#include <stdexcept>
struct Foo
{
    char id{'?'};
    int count = std::uncaught_exceptions();
    ~Foo()
    {
        count == std::uncaught_exceptions()
            ? std::cout << id << ".~Foo() called normally\n"
            : std::cout << id << ".~Foo() called during stack unwinding\n";
    }
};
int main()
{
    Foo f{'f'};
    try
    {
        Foo g{'g'};
        std::cout << "Exception thrown\n";
        throw std::runtime_error("test exception");
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception caught: " << e.what() << '\n';
    }
}

가능한 출력:

Exception thrown
g.~Foo() called during stack unwinding
Exception caught: test exception
f.~Foo() called normally

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 70 C++98 uncaught_exception() 의 예외 명세가 누락됨 throw() 로 명시됨

참고 항목

예외 처리 실패 시 호출되는 함수
(함수)
예외 객체 처리를 위한 공유 포인터 타입
(typedef)
현재 예외를 std::exception_ptr 에 캡처함
(함수)

외부 링크

1. GOTW 이슈 47: 처리되지 않은 예외
2. std::uncaught_exceptions 에 대한 근거 (N4125)