[英]Derived exception class not caught
開始使用googletest ASSERT_THROW子句,似乎“有時”處理了所引發異常的基本類型。 我將相關的代碼部分簡化為:
// myexception.h
struct myexception : public std::logic_error {
myexception(const char* what):std::logic_error(what){}
};
void throwMy();
// myexception.cpp
void throwMy(){ throw myexception(NULL); }
這是我的測試代碼:
//
void localThrowMy(){ throw myexception(""); }
// test code, based upon the ASSERT_THROW macro
try {
throwMy(); // outputs "logic_error"
//localThrowMy(); // would output "what I expected"
}
catch( myexception & ) { cout << "what I expected"; }
catch( std::logic_error & ) { cout << "logic_error"; } // my addition
catch(...) { cout << "mmmh."; }
奇怪的是:如果我在與測試代碼相同的編譯單元中聲明throwMy
函數,則會輸出“我所期望的”。 如果在另一個單元中,則測試輸出“ logic_error”。
此代碼正確嗎? 鏈接器在這里可能出錯嗎?
std::logic_error
構造函數接收std::string&
作為參數,而不是const char *
。 因此,傳遞NULL
是未定義的行為。
考慮將std::string&
也用於myexception
。
Mea Culpa。
再一次, select沒有被打破 。
在std::string
構造函數中引發了logic_error
:“ basic_string :: _ S_construct NULL無效”。 我錯誤地推斷出繼承存在問題。 這是佩布卡奇的一個簡單案例。
其實我不知道。 但是您不能將空指針傳遞給 std::string
構造函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.