2013-03-19 4 views
1

Q : 스택을 푸는 데 예외가 발생해도 안전합니까? 아니면 응용 프로그램이 두 번째 throw에서 terminate을 호출합니까?스택을 푸는 것이 안전할까요?

최소한의 예 :

void some_function() 
{ 
    try 
    { 
     // do stuff here that can throw 
     throw std::runtime_error("blah"); 
    } catch(const std::exception& re) 
    { 
     try // this code could be in some function called from here 
     { 
      // do something with re here that throws a logical_error 
      throw std::logical_error("blah blah"); // does this call terminate? 
     } catch(const std::logical_error& le) 
     { 
     } 
    } 
} 

내가 this question을 읽고 호기심이 있어요.

참고 : 나는 소멸자해야 catch(...)/당신이 할 수있는 알고 있지만, 그것은 일반적으로 의미가 catch 블록에 try/catch을 할 수 있도록 않습니다 - 아마도 몇 가지 기능에 (내 예 re)을 제외하고 호출?

+2

그래도 스택 해제 중에는 그렇지 않습니다. 맞습니까? AFAIK, 일단 catch 블록이 입력되면 스택은 이미 풀린 상태입니다. – Pubby

+1

Ahh ... thanks :) 대답으로 추가하면 받아 들일 것입니다. – utnapistim

+0

닫을 필요가 없습니다. 잘못되었을 수 있습니다. 내 의견은 추측에 가깝습니다. – Pubby

답변

4

그건 실제로 스택을 푸는 동안 아니에요. catch 블록이 입력되면 스택은 이미 풀린 상태입니다.

예, 해당 코드는 유효합니다. 이 질문을보십시오 : Nested try...catch inside C++ exception handler?

+1

반대로, 소멸자를 던지면 ** "스택에서 푸는"상태가 될 수 있습니다. 그리고 그 시나리오를 위해 특별히 정의 된 행동이 있습니다. –

+1

+1. 예, catch 블록에 들어갈 때, 예외는 없습니다. 즉, catch 블록이 던질 수 있다는 것을 의미합니다. 그 행동은 잘 정의되어 있습니다. 사실, rethrow ('catch'에서만 허용되는) rethrow는 throw의 한 종류입니다. – Nawaz

2

당신이 묘사하고있는 시나리오에 가장 잘 맞는 답은 답답합니다.

부록으로, 스택이 풀리는 동안 실행되는 유일한 사용자 코드는 소멸자 (소멸자가 호출하는 코드)입니다. 이 시나리오 동안 소멸자throw경우

는 표준 std::terminate()가 호출되도록 지정합니다.

+1

아닙니다. 이 시나리오에서 소멸자 **에서 전파되는 예외 **를 throw하면 표준에서'std :: terminate()'가 호출되도록 지정합니다. 'try {throw 3; } catch (int) {}'는 소멸자 내에서'std :: terminate()'로 이어지지 않을 것입니다. –

관련 문제