난 그냥이 코드 발견 :"던지기"무엇입니까? 캐치 블럭 밖에서?
void somefunction()
{
throw;
}
를하고 궁금해 : 그것은 무엇을 의미합니까?
저는 답을 모르기 때문에 질문을 C++ 및 Visual C++로 태그했습니다. 대답은 표준 또는 특별한 Visual C++ 확장 또는 표준을 무시하는 Visual C++와 관련되었을 수 있습니다. 그래서 두 태그가 모두 합당하다고 생각한 것입니다.
난 그냥이 코드 발견 :"던지기"무엇입니까? 캐치 블럭 밖에서?
void somefunction()
{
throw;
}
를하고 궁금해 : 그것은 무엇을 의미합니까?
저는 답을 모르기 때문에 질문을 C++ 및 Visual C++로 태그했습니다. 대답은 표준 또는 특별한 Visual C++ 확장 또는 표준을 무시하는 Visual C++와 관련되었을 수 있습니다. 그래서 두 태그가 모두 합당하다고 생각한 것입니다.
물론 somefunction()
은 일부 catch
블록 내부에서만 호출 될 수 있습니다 (추측에 따르면, 어쨌든 그 의도 일 것입니다).
예외가 활성화되어 있지 않을 때 throw;
이 실행되면 terminate()
(§15.1/8)을 호출합니다.
현재 활성화 된 예외를 다시 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"를 출력합니다.
throw
의 경우 "외부"또는 "내부"catch 블록이라는 개념은 컴파일 타임 용어가 아니라 런타임 조건으로 정의됩니다. 따라서 실행 중에 런타임에 catch
블록의 throw
이 실행되면 throw
이 예상대로 작동합니다. 그렇지 않으면 terminate()
이 호출됩니다.
실제로 C++ 예외가 언어 사양에 정의 된 방법을 면밀히 살펴보면 런타임 조건에서 많은 것들이 정의됩니다. 때로는 심지어 un-C++처럼 보입니다.
아니요, 저는 그런 일을하지 않았다. 그러나 나는 그 기능의 사용법을 충분히 언급하지 않았다. 오해를해서 죄송합니다. –
사람들은 이미 그것이 무엇을 의미하는지 설명했으나, 왜 사람들이 그것을 볼 수 있는지 아는 것이 잠재적으로 유용합니다. 중복 된 코드의 양을 줄이기 위해 유형에 따라 예외를 처리하는 '일반적인'예외 처리기를 만드는 유용한 방법입니다.
그래서 우리는 Neil's example을 가지고 f()
우리가 내가 this answer에서 제안 내 LogKnownException()
기능처럼 무언가를 구현 끝낼 수있는 일을 할 수있는 무엇을 확장합니다.
모든 장소에서 모든 방식의 예외를 기록하려는 팀에서 작업하는 경우 이러한 모든 장소 (또는 더 나쁜 매크로)에서 많은 수의 catch 블록을 사용하는 대신 간단한 나는 단순히 밖으로 전파 및 처리되지 않은 방식으로 계속 로그를하고 싶지 않았다 예외를 허용 하나에 LogKnownException()
의 내 앞의 예를 변경 거라고 기대하지만이
catch(...)
{
LogKnownException();
}
과 같은 catch 블록.
나는 반드시 이것이 좋은 일이라고 제안하는 것이 아니며, 단지 이것이 사용 된 구조를 볼 가능성이있는 곳이라고 지적하고 있습니다.
이 질문은 Visual Studio 또는 모든 종류의 "Visual"C++와 관련이 없습니다. 제발, 구체적인 프레임 워크 태그와 함께 일반적인 C + + 질문 태그하지 마십시오. –
@Pavel Shved : 언어 확장이 적용될 수 있다면 VC++과 관련된 질문 일 수 있습니다.이 경우 표준에 따라 답변을 지적하면서 그 기준에 따라 대답하는 것이 바람직합니다. –
@David, @Tobias, 확실하지 않은 경우 VC 관련 질문에 태그를 추가하지 않는 것이 좋습니다. 언어 확장이 발생하면 커뮤니티에서 적절하게 다시 태그를 지정합니다. –