std:: uncaught_exception, std:: uncaught_exceptions
|
헤더에 정의됨
<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) |
std::uncaught_exception
는 현재
스택 풀기(stack unwinding)
가 진행 중인지 여부를 감지합니다.
때로는 std :: uncaught_exception ( ) == true (C++17까지) std :: uncaught_exceptions ( ) > 0 (C++17부터) 인 경우에도 예외를 던져도 안전할 때가 있습니다. 예를 들어, 스택 풀기 로 인해 객체가 소멸될 때, 해당 객체의 소멸자가 예외를 던지는 코드를 실행할 수 있습니다. 단, 해당 예외가 소멸자를 벗어나기 전에 어떤 catch 블록에 의해 잡히는 경우에 한합니다.
목차 |
매개변수
(없음)
반환값
참고 사항
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()
로 명시됨
|
참고 항목
|
예외 처리 실패 시 호출되는 함수
(함수) |
|
|
(C++11)
|
예외 객체 처리를 위한 공유 포인터 타입
(typedef) |
|
(C++11)
|
현재 예외를
std::exception_ptr
에 캡처함
(함수) |
외부 링크
| 1. | GOTW 이슈 47: 처리되지 않은 예외 |
| 2. |
std::uncaught_exceptions
에 대한 근거
(N4125)
|