2013-08-02 2 views
0

다른 예외에서 파생 된 새 예외를 만드는 방법은 여러 가지가 있습니다. 한 가지 방법은 this기존 파생 새 예외 만들기

struct MyException : public exception 
{ 
    const char * what() const throw() 
    { 
    return "C++ Exception"; 
    } 
}; 

같은 것을 사용하는 또 다른 방법은 기본 클래스의 생성자를 호출하는 것입니다. 두 번째 방법은 분명 날 (작성시)을 어떻게() 메소드에 의해 출력되는 문자열을 삽입 할 수있는 이점을 제공

class My:public runtime_error 
{ 
public: 
    My(string s):runtime_error(s){} 
}; 

. 내 질문은 어떤 방법을 선호해야하며, 첫 번째 방법을 전혀 사용해야하는지 여부입니다.

답변

1

정말로 문자열 리터럴 만 사용하려는 경우 첫 번째 옵션으로 갈 수 있지만 두 번째는 어디에서나 볼 수있는 기본값입니다.

그러나 C++ 예외 클래스를 나중에 확장하려고 결정한 경우 예외 문자열에 기반한 두 번째 방법을 사용하면 문제가 발생할 수 있습니다. 그래서 첫 번째 버전을 전혀 사용할 이유가 없습니다.

은 BTW :() throw()

+0

"const를 문자 * 무엇을() const를 noexcept"컴파일되지 않습니다하지 noexcept 것입니다. 나는이 "noexcept 버전"을 "http://www.cplusplus.com/reference/exception/exception/exception/"에서 발견했지만 컴파일에 실패했습니다. – Slazer

+1

컴파일러 오류가 무엇입니까? 대부분의 컴파일러는 C++ 11을 완벽하게 준비하지 못했을 것입니다. –

+0

코드와 함께 오류가 http://pastebin.com/PQ8ZhV24에 있습니다. 컴파일러는 "g ++ (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)" – Slazer

관련 문제