std::uncaught_exception, std::uncaught_exceptions
| 헤더에 정의됨 <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) |
std::uncaught_exception 감지합니다: 스택 되감기가 현재 진행 중인지때로는 예외를 던져도 안전한 경우가 있습니다. 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)
|