Namespaces
Variants

std:: uncaught_exception, std:: uncaught_exceptions

From cppreference.net
헤더에 정의됨 <exception>
(1)
bool uncaught_exception ( ) throw ( ) ;
(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 는 현재 스택 풀기(stack unwinding) 가 진행 중인지 여부를 감지합니다.
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)