2015-01-02 6 views
9

난 그냥 C++ (17)가 int를 반환하는 std::uncaught_exceptions()과 더불어, bool를 반환하는 std::uncaught_exception()을 대체 할 것이다std :: uncaught_exceptions로 std :: uncaught_exception이 변경되는 이유는 무엇입니까?

http://en.cppreference.com/w/cpp/error/uncaught_exception

에 걸쳐 나타났습니다.

http://isocpp.org/files/papers/n4259.pdf

그것은 근거를 제공하지 않고 있지만

[참고 말할 않는다 :

이 기술 표준에 첨가 여기 uncaught_exceptions()> 0, 예외를 던지면 std :: terminate() (15.5.1) 호출이 발생할 수 있습니다. - 끝말]

이상하게 모호합니다.

변경 이유는 무엇입니까? C++ 17 또는 향후 표준 버전에서 여러 활성 예외가 가능합니까?

+1

여러 가지 활성 예외가 모든 버전의 C++에 존재할 수 있습니다. 'struct foo {~ foo() {try {throw new int; } catch (...) {}}}; int main() {{foo f; 새로운 더블 던져; } catch (...) {}}'는'f'를 파기 할 때 두 가지 활성 예외가 있습니다. – Yakk

+1

참고 사항 [this CppCon 2015 talk] (https://github.com/CppCon/CppCon2015/blob/master/Presentations/Declarative%20Control%20Flow/Declarative%20Control%20Flow%20-%20Andrei%20Alexandrescu%20-% 20CppCon % 202015.pdf) Andrei Alexandrescu의 'ScopeGuard'와 N4259에 대한 정보. – Adversus

답변

18

이 인용하면 (일반적으로 "ScopeGuard 작업을"아래로 비등) 근거를 가지고이 n4152이었다 도입 용지,

의 전문가로 1998 년부터 적어도 설명 된대로

주 # 47, 그것은 해체 중 호출 될 수있는 소멸자로부터 전이 적으로 호출되는 코드가 unwinding의 일부로 실제로 호출되는지 여부를 정확히 감지 할 수 없음을 의미합니다. 예외가 풀리면 uncaught_exception에 모든 활성 예외가 두 개 있어도 모든 것이 해제되는 것처럼 보입니다.

그리고

이 주요 구현에 이미 존재하는 정보를 사용하여 위치를 오늘 "실제로 휴대용"ScopeGuard를 만들기 위해 문서화되지 않은 컴파일러 기능에 의존 이식성 코드 ScopeGuard 리조트의 현재 구현. 이 옵션은 이러한 용도는 진정한 휴대용 될 수 있도록, 컴파일러에 이미 존재하는 정보를 노출하는 하나의 새로운 기능을 추가 할 것을 제안

PS : 다음은이 기능이 컴파일러 한 중복 정보를 사용하여 구현 될 수있는 방법의 예입니다 : 그것이 가능 BOOST_LOG(lg) << foo();는이 경우 생성 가드 개체의 소멸자에 로그인 할 수있게 :

그리고 그것이 사용되는 간단한 예를 들어 https://github.com/panaseleus/stack_unwinding/blob/master/boost/exception/uncaught_exception_count.hpp는 boost.log의 "레코드 펌프"(boost/log/sources/record_ostream.hppboost/log/detail/format.hpp 참조)보다 더 봐 foo은 소멸되지 않습니다. 즉, 소멸자가 호출 될 때 비행중인 예외 수가 더 많지 않으면 한 생성자가 호출되었을 때.

+8

여러 활성 예외가 존재할 수있는 방법을 보여주는 예제가 표시 될 수 있습니다. – Yakk

-1

std :: uncaught_exception()은 스택의 풀어 내기 여부 만 감지합니다. Herb Sutter가 쓴 논문에서 그는 적극적인 예외가 있음을 신뢰할 수 없다고 지적했다. 허브는 이것이 "거의"유용하다는 것을 보여줍니다.나는 이것이 실제로 모호한 상황에 직면했다. 그것이 나를이 게시물로 인도했다.

활성 예외 수를 반환하는 것으로 std :: uncaught_exceptions()가 지정되었습니다. 실제로 유용합니다.

-1

std :: uncaught_exception()은 여전히 ​​debug/loginfo에 유용 할 수 있습니다. 예외가 발생한 위치를 판별하는 데 도움이됩니다. 그러나 나는 기능상으로, 그것의 확실히 쓸모없는, 동의한다.

관련 문제