c++ - try - throw std::< exception



스택 해제 중에 std:: current_exception을 사용할 수 있습니까? (1)

C ++ 표준은 18.8.5 절 [전파]에서 current_exception() 을 정의합니다.

(강조 광산)

exception_ptr current_exception() noexcept;

반환 값 : 현재 처리되고있는 예외 (15.3) 또는 현재 처리되고있는 예외 의 복제를 참조 하는 exception_ptr 객체. 예외가 처리되어 있지 않은 경우는 null exception_ptr 객체. 참조 된 객체는 최소한 참조하는 exception_ptr 객체가있는 한 유효한 상태를 유지해야한다.

그리고 § 15.3 [except.handle], 메모 7과 8 :

  1. 핸들러는 catch 절의 매개 변수 (있는 경우)에 대해 초기화가 완료되면 활성화 된 것으로 간주됩니다. [참고 : 스택은 그 시점에서 풀려 났을 것입니다 . - 끝말]

  2. 가장 최근에 활성화 된 핸들러가 아직 활성 상태 인 예외를 현재 처리되는 예외 라고합니다.

current_exception() 의해 반환 된 예외는 가장 최근의 활성 처리기를 제외한 "현재 처리 된 예외"로 정의되며 처리기는 스택 해제가 완료 될 때만 활성화됩니다.

테스트 결과에 따르면 스택 해제 중에는 "활성 핸들러"가 없기 때문에 "현재 처리 된 예외"도 없습니다.이 경우 current_exception() 은 null exception_ptr 을 반환합니다.

스택 해제 중에 파괴되는 객체의 소멸자 내에서 std :: current_exception을 사용할 수 있습니까?

cppreference의 문서 내용 :

예외 처리 중에 호출되면 (일반적으로 catch 절에서) 현재 예외 객체 (...)를 캡처합니다.

그러나 스택 해제가 예외 처리의 일부인지 여부는 분명하지 않습니다.

stackoverflow 에서 가장 높은 순위의 답변 을 작성자는 그것이 가능하다고 가정합니다.

내 컴파일러 (g ++ (우분투 4.8.2-19ubuntu1) 4.8.2)에 대한 몇 가지 테스트를했는데 std :: current_exception은이 경우 빈 포인터를 반환합니다.

#include <exception>
#include <stdexcept>
#include <iostream>


struct A
{
    ~A()
    {
        std::clog << "in destructor"<<std::endl;
        std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
        std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
    }
};

int main(int argc, char **)
{
    try
    {
        A aa;
        std::clog << "before throw"<<std::endl;
        if(argc>1)
            throw std::runtime_error("oh no");
    }
    catch(...)
    {
        std::clog << "in catch block"<<std::endl;
        std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
        std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
    }

    return 0;
}

출력은 다음과 같습니다.

before throw
in destructor
uncaught_exception: 1
current_exception: 0
in catch block
uncaught_exception: 0
current_exception: 1

표준이 말하는 것을 누구가 아는가?





exception-handling