簡體   English   中英

未捕獲派生異常類

[英]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”。

  • g ++ --version:(Debian 4.4.5-8)4.4.5
  • ld --version:(用於Debian的GNU Binutils)2.20.1-system.20100303

此代碼正確嗎? 鏈接器在這里可能出錯嗎?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM