2015-10-07 38 views
1

您好我試圖創建新的異常,接收參數並將字符串發送到基類。創建新的異常,接收參數

代碼

class EmptyFunctionException : public std::runtime_error { 
public: 
    EmptyFunctionException(std::string filename, std::string funcname){ 
     std::stringstream ss; 
     ss << filename << " " << funcname; 
     std::runtime_error(ss.str()); 
    } 
}; 

錯誤

基類runtime_error「沒有默認構造函數。

我知道我需要把它像

EmptyFunctionException(std::string filename, std::string funcname) 
    : std::runtime_error(...) 

,但我如何創建前的字符串?

謝謝。

+0

甚至更​​好:定義參數時使用'const std :: string&filename'。 – tadman

+2

'runtime_error(filename +「」+ funcname)''? – 0x499602D2

+0

編譯器是不是讓傳遞const引用的速度與傳遞值的速度相同? – Koten

回答

2

std :: runtime_error的類聲明沒有默認構造函數,因此需要您在繼承的類的構造函數中調用基礎構造函數。我知道你說過,在你的問題中,但這是列在這裏的一個重要事實。

不要使用stringstream來構造更復雜的字符串。在這種情況下,只需在基類型的構造函數中構造字符串就很簡單。

class EmptyFunctionException : public std::runtime_error { 
public: 
    EmptyFunctionException(std::string filename, std::string funcname) : 
     std::runtime_error(filename + " " + funcname) 
    { 
    } 
}; 
+1

如果參數是由'const'引用取得的,那將會更好。 – 5gon12eder

+1

我同意你@ 5gon12eder。但是,我只是回答了不給他代碼審查的問題。 –

+0

@ 5gon12eder,編譯器不會讓傳遞const引用的速度與傳遞值的速度相同嗎? – Koten

0

如果你真的需要複雜的格式和簡單連接,不會做,你總是可以有一箇中間類:

class EmptyFunctionException : public std::runtime_error { 
    struct ErrorFormatter { 
     ErrorFormatter(const std::string& filename, const std::string funcname)    
     { 
      std::stringstream ss; 
      ss << filename << " " << funcname; 
      errstr = ss.str(); 
     } 
     const std::string& str() const { return errstr; } 
     private: 
     std::string errstr; 
    }; 
public: 
    EmptyFunctionException(std::string filename, std::string funcname) : 
     std::runtime_error(ErrorFormatter(filename, funcname).str()) {} 
}; 
+0

爲什麼不只是一個('靜態'成員)函數? – 5gon12eder

+0

@ 5gon12eder我已經得出結論,可能整個派生的異常是毫無意義的。返回'std :: string'的靜態成員函數也可以工作。 –

1

我會走的路,不設置基本的what()消息例外實際上構造,而是根據自己的需要覆蓋what()方法:

class EmptyFunctionException : public std::runtime_error { 
public: 
    EmptyFunctionException(const std::string filename&, const std::string& funcname 
    : std::runtime_error(""), filename_(filename), funcname_() { 
     std::stringstream ss; 
     ss << filename << " " << funcname; 
     msg_ = ss.str(); 
    } 

    const char* what() const noexcept { 
     return msg_.c_str(); 
    } 

private: 
    std::string filename_; 
    std::string funcname_; 
    std::string msg_; 
}; 

由於what()在底層被聲明爲virtual,並且它是受所需基本異常參數影響的唯一方法,似乎最好覆蓋它。


雖然,那麼我會考慮一下,什麼是特定EmptyFunctionException的整個目的是什麼?是否應該有一些特殊的邏輯來處理runtime_error以外的內容,還是僅僅用於執行錯誤消息格式?

在後一種情況下,可以簡單地在拋出異常之前完成。

+0

我認爲什麼()需要簽名'const char * what()const noexcept' – Koten