比方說,我有這樣的:型鑄件例外
namespace MyNamespace{
class Exception : public std::runtime_error
{
public:
explicit Exception(const std::string &msg) : std::runtime_error(msg) {}
};
} //namespace MyNamespace
而且還有一個碼的地方在我的程序:
try{
foo();
}
catch (const MyNamespace::Exception &exc){
std::cout << exc.what();
}
的問題是(我要你檢查我) - 將我趕上了異常,如果我在寫foo的:
1)throw MyNamespace::Exception("Hello world!");
在這裏,我想,是的,我會的,是因爲我明確指出了異常的類型(並且它是「顯式」關鍵字的必要條件),並且std :: string沒有「顯式」關鍵字,這意味着我可以拋出「Hello world!」。不是的std :: string( 「世界,你好!」)
2)throw MyNamespace::Exception(std::string("Hello world!"));
obviosly,我會的。
3)throw "Hello world!";
在這裏,我想,不,我不會,關鍵字 「顯性」 存在的原因。
4)throw std::string("Hello world");
沒有(同樣的原因)
和5)我趕對子級在3-4的情況下expections如果我沒有明確的關鍵字? (我認爲是)
更新: 6)當臨時對象std :: string將被創建?在什麼時間點?
感謝您的回答,但我沒有意識到第六個問題的答案:爲什麼會在異常是_thrown_時創建,而不是_cought_?我們是否在談論std :: string的權利? –
因爲語言規範是這樣說的。 catch子句不知道要創建什麼類型的對象,因爲單個處理程序可以匹配幾個不同的throw表達式。無論我們是否在討論'std :: string'都不是真正相關的。 – jrok
啊,我的意思是有點不一樣。如果我們只拋出像「Hello world!」這樣的const char [x],就會創建臨時對象std :: string。 –