2009-06-24 2 views

답변

13

문자열의 내용은 구현이 정의되어 있으므로 대답은 '예'입니다.

편집 : Belay that. 표준은 다음과 같습니다 :

virtual const char* what() const throw(); 
5 Returns: An implementation-defined NTBS. 

그래서 포인터가 아니라 문자열을 반환해야합니다. 문자열은 NULL이 될 수 없습니다. 다른 사람들이 지적한 것처럼 what()NULL을 반환하는 예외를 파생시키기는 쉽지만 표준 적합성에 어떻게 맞는지 잘 모르겠습니다. 물론, 자신의 예외 클래스에서 what()을 구현하는 경우, NULL을 반환하도록 허용하는 것은 매우 나쁜 습관이라고 생각할 것입니다.

더 :

NULL을 반환하고, 유사한 흥미로운 문제는 물론 Extending the C++ Standard Library by inheritance?

+0

자체가 던질 수있는 예외 처리 코드를 조심해야하지만 당신은이 단지에 의해 체포되어 무엇을 overwridde 경우 const std :: exception & then NULL 일 수 있습니다. –

+0

그래야 가상 프로그래머가 NULL이 될 수도 있습니다. – JaredPar

+0

흥미 롭습니다. 이제는 어떤 사람들이 std :: string과 c_str() 메서드를 통해 구현할 것을 알고 있기 때문에 c_str()을 제대로 구축 한 std :: string이 NULL을 반환 할 수 있습니까? (필자가 작업하는 코드베이스에서 이러한 상황을 겪었 기 때문에 묻습니다. TODO를 추가 할 것인지 아닌지 알고 싶습니다.) –

2

는 NULL이 될 수 참조하십시오 수 있습니다 what() 여부 주소 추가 질문 :

class myexception: public exception 
{ 
    virtual const char* what() const throw() 
    { 
    return NULL; 
    } 
} myex; 
+1

** ** 언어 **에서이 작업을 수행 할 수 있습니다. 당신의 코드는 컴파일 될 것입니다.)하지만 이것은 C++ 표준에 의해 금지되어 있습니다 - Neil의 대답을보십시오. IOW, 다른 사람의 코드가이 작업을하지 않는 것에 의존 할 수 있기 때문에이 작업을 수행하지 마십시오. –

+0

나는 그것이 "불법"이라고 생각하지 않는다. 표준은 std :: exception :: what의 동작을 지정한다. std :: exception에서 파생 된 사용자 등급의 요구 사항을 만드는 것처럼 보이지 않는다. –

5

하는 경우 누군가 std :: exception에서 상속 받았으며 NULL을 반환 할 대상을 재정의했습니다. 그러면 가능합니다.

class CMyException : public std::exception 
    { 
    ... 
     virtual const char * what() const {return NULL;} 
    }; 

Neil의 우수한 표준 찾기에도 불구하고 여전히 NULL인지 확인하는 것이 좋습니다. std :: exception 상태의 자식 클래스의 사양이 NULL을 반환해서는 안되지만 컴파일러에서 아무 것도이를 시행하지 않으며 위의 코드는 언어에 따라 여전히 유효합니다. 이 어설를 사용하는 이상적인 상황 일 수

...

assert(except.what() != NULL); 

또는

if (except.what() != NULL) 
{ 
     ... normal processing ... 
} 
else 
{ 
     assert(false); 
} 

이 뭔가 아마 이제까지 발생해서는 안 경우는, 당신이 그것을 가정하고 있기 때문에 일은해서는 안되지만, 당신의 가정이 틀렸다고 (디버그 모드에서) 알기를 원한다. 그런 다음 잘못된 가정을 해결하거나 잘못된 가정을 상대로 잘못된 코드를 처리 할 수 ​​있습니다 (NULL을 반환하지 않는지 확인하십시오).

+1

** ** 언어로 ** 가능합니다 (즉, 코드가 컴파일됩니다). 그러나 이것은 C++ 표준에 의해 금지됩니다. Neil의 답변을 참조하십시오. –

+0

그래, 난 그냥 NULL을 반환하는 경우 그것은 정의되지 않은 동작 여부를 모르겠습니다. 그것은 무엇을 위해 규정 한 것을 위반합니다(). –

0

으로 많은 사람들이 what() 수익을, 널 포인터를 지적하지만 을 수 있습니다. null 테스트의 런타임 오버 헤드는 예외적 인 경우에만 발생합니다. 예외적 인 경우가 덜 중요 할 것입니다.

어쨌든 assert을 사용하는 것이 좋습니다.

코드 공간이 문제가되는 경우 assert, 테스트, 코드 검토 및 기타 품질 보증을 수행하여 배송하기 전에 문제가있는 위반 사항을 추적 할 수 있습니다.또한

는 (. std::bad_alloc 예외를 처리하는 동안 std::string으로 메모리를 할당, 다른 사람이 언급 한 것처럼, 예를 들어)

+0

std :: bad_alloc을 처리하는 동안 메모리를 할당하는 것은 좋은 생각이 아닙니다. 다른 예외의 경우에는 std :: string을 사용하지 않는 것이 좋습니다. –

관련 문제