잡힌 std :: exception은 NULL이되는 what()을 가질 수 있습니까?C++ 예외, what()이 NULL 일 수 있습니까?
오버 헤드 아래에 e.what()가 있는지 확인하고 있습니까?
//...
}
catch (const std::exception& e)
{
std::string error;
if(e.what())
error = e.what();
}
잡힌 std :: exception은 NULL이되는 what()을 가질 수 있습니까?C++ 예외, what()이 NULL 일 수 있습니까?
오버 헤드 아래에 e.what()가 있는지 확인하고 있습니까?
//...
}
catch (const std::exception& e)
{
std::string error;
if(e.what())
error = e.what();
}
문자열의 내용은 구현이 정의되어 있으므로 대답은 '예'입니다.
편집 : 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?
는 NULL이 될 수 참조하십시오 수 있습니다 what()
여부 주소 추가 질문 :
class myexception: public exception
{
virtual const char* what() const throw()
{
return NULL;
}
} myex;
** ** 언어 **에서이 작업을 수행 할 수 있습니다. 당신의 코드는 컴파일 될 것입니다.)하지만 이것은 C++ 표준에 의해 금지되어 있습니다 - Neil의 대답을보십시오. IOW, 다른 사람의 코드가이 작업을하지 않는 것에 의존 할 수 있기 때문에이 작업을 수행하지 마십시오. –
나는 그것이 "불법"이라고 생각하지 않는다. 표준은 std :: exception :: what의 동작을 지정한다. std :: exception에서 파생 된 사용자 등급의 요구 사항을 만드는 것처럼 보이지 않는다. –
하는 경우 누군가 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을 반환하지 않는지 확인하십시오).
** ** 언어로 ** 가능합니다 (즉, 코드가 컴파일됩니다). 그러나 이것은 C++ 표준에 의해 금지됩니다. Neil의 답변을 참조하십시오. –
그래, 난 그냥 NULL을 반환하는 경우 그것은 정의되지 않은 동작 여부를 모르겠습니다. 그것은 무엇을 위해 규정 한 것을 위반합니다(). –
으로 많은 사람들이 what()
안 수익을, 널 포인터를 지적하지만 을 수 있습니다. null 테스트의 런타임 오버 헤드는 예외적 인 경우에만 발생합니다. 예외적 인 경우가 덜 중요 할 것입니다.
어쨌든 assert
을 사용하는 것이 좋습니다.
코드 공간이 문제가되는 경우 assert
, 테스트, 코드 검토 및 기타 품질 보증을 수행하여 배송하기 전에 문제가있는 위반 사항을 추적 할 수 있습니다.또한
std::bad_alloc
예외를 처리하는 동안
std::string
으로 메모리를 할당, 다른 사람이 언급 한 것처럼, 예를 들어)
std :: bad_alloc을 처리하는 동안 메모리를 할당하는 것은 좋은 생각이 아닙니다. 다른 예외의 경우에는 std :: string을 사용하지 않는 것이 좋습니다. –
자체가 던질 수있는 예외 처리 코드를 조심해야하지만 당신은이 단지에 의해 체포되어 무엇을 overwridde 경우 const std :: exception & then NULL 일 수 있습니다. –
그래야 가상 프로그래머가 NULL이 될 수도 있습니다. – JaredPar
흥미 롭습니다. 이제는 어떤 사람들이 std :: string과 c_str() 메서드를 통해 구현할 것을 알고 있기 때문에 c_str()을 제대로 구축 한 std :: string이 NULL을 반환 할 수 있습니까? (필자가 작업하는 코드베이스에서 이러한 상황을 겪었 기 때문에 묻습니다. TODO를 추가 할 것인지 아닌지 알고 싶습니다.) –