2010-04-22 3 views
19

난 그냥이 코드 발견 :"던지기"무엇입니까? 캐치 블럭 밖에서?

void somefunction() 
{ 
    throw; 
} 

를하고 궁금해 : 그것은 무엇을 의미합니까?


저는 답을 모르기 때문에 질문을 C++ 및 Visual C++로 태그했습니다. 대답은 표준 또는 특별한 Visual C++ 확장 또는 표준을 무시하는 Visual C++와 관련되었을 수 있습니다. 그래서 두 태그가 모두 합당하다고 생각한 것입니다.

+3

이 질문은 Visual Studio 또는 모든 종류의 "Visual"C++와 관련이 없습니다. 제발, 구체적인 프레임 워크 태그와 함께 일반적인 C + + 질문 태그하지 마십시오. –

+0

@Pavel Shved : 언어 확장이 적용될 수 있다면 VC++과 관련된 질문 일 수 있습니다.이 경우 표준에 따라 답변을 지적하면서 그 기준에 따라 대답하는 것이 바람직합니다. –

+0

@David, @Tobias, 확실하지 않은 경우 VC 관련 질문에 태그를 추가하지 않는 것이 좋습니다. 언어 확장이 발생하면 커뮤니티에서 적절하게 다시 태그를 지정합니다. –

답변

28

물론 somefunction()은 일부 catch 블록 내부에서만 호출 될 수 있습니다 (추측에 따르면, 어쨌든 그 의도 일 것입니다).

예외가 활성화되어 있지 않을 때 throw;이 실행되면 terminate() (§15.1/8)을 호출합니다.

9

현재 활성화 된 예외를 다시 throw합니다. catch 블록에서 간접적으로 호출하는 것이 의미가 있습니다. 이것은 :

#include <iostream> 
using namespace std; 

void f() { 
    throw; 
} 

int main() { 
    try { 
     try { 
      throw "foo"; 
     } 
     catch(...) { 
      f(); 
     } 
    } 
    catch(const char * s) { 
     cout << s << endl; 
    } 
} 

"foo"를 출력합니다.

4

throw의 경우 "외부"또는 "내부"catch 블록이라는 개념은 컴파일 타임 용어가 아니라 런타임 조건으로 정의됩니다. 따라서 실행 중에 런타임에 catch 블록의 throw이 실행되면 throw이 예상대로 작동합니다. 그렇지 않으면 terminate()이 호출됩니다.

실제로 C++ 예외가 언어 사양에 정의 된 방법을 면밀히 살펴보면 런타임 조건에서 많은 것들이 정의됩니다. 때로는 심지어 un-C++처럼 보입니다.

+0

아니요, 저는 그런 일을하지 않았다. 그러나 나는 그 기능의 사용법을 충분히 언급하지 않았다. 오해를해서 죄송합니다. –

3

사람들은 이미 그것이 무엇을 의미하는지 설명했으나, 왜 사람들이 그것을 볼 수 있는지 아는 것이 잠재적으로 유용합니다. 중복 된 코드의 양을 줄이기 위해 유형에 따라 예외를 처리하는 '일반적인'예외 처리기를 만드는 유용한 방법입니다.

그래서 우리는 Neil's example을 가지고 f() 우리가 내가 this answer에서 제안 내 LogKnownException() 기능처럼 무언가를 구현 끝낼 수있는 일을 할 수있는 무엇을 확장합니다.

모든 장소에서 모든 방식의 예외를 기록하려는 팀에서 작업하는 경우 이러한 모든 장소 (또는 더 나쁜 매크로)에서 많은 수의 catch 블록을 사용하는 대신 간단한 나는 단순히 밖으로 전파 및 처리되지 않은 방식으로 계속 로그를하고 싶지 않았다 예외를 허용 하나에 LogKnownException()의 내 앞의 예를 변경 거라고 기대하지만이

catch(...) 
{ 
    LogKnownException(); 
} 

과 같은 catch 블록.

나는 반드시 이것이 좋은 일이라고 제안하는 것이 아니며, 단지 이것이 사용 된 구조를 볼 가능성이있는 곳이라고 지적하고 있습니다.