我遇到了一些我繼承的代碼的情況......老實說,我相信代碼是正確編寫的,但是這個錯誤似乎仍然表現出來。試着抓住不按預期工作
我會很快注意到,代碼是從Linux交叉編譯到LynxOS,我不確定這是否與錯誤有關。
基本上,在一個特定的情況下:
try {
std::vector<ClassA> x = SomeGeneratingFunction();
//We get to here fine. X may be empty/unpopulated though.
if (x.size() < 1)
{
throw(MyException("It crashed."));
}
}
catch (MyException e)
{
//Handle it.
}
catch (...)
{
//Handle it.
}
我們拋出給出的載體是無人居住的,但由於某些原因,罰球繞過catch子句 - 他們兩個。它似乎只發生在這裏 - 雖然我們通常不會形成一個if語句範圍,但是它應該完全不相關,因爲它仍然處於嘗試範圍之內。
PS:下面的代碼實際上是一個函數的內容,即使它們應該全部由catch塊處理,異常也會在函數調用時出來。
任何想法這可能嗎?是的,這不是真正的代碼/異常類,但異常類是你重載std :: exception的簡單例子,SomeGeneratingFunction()確實返回一個好的向量,即使它是空的。我無法提供真實的代碼,但是這是非常接近的,除非我可能把我寫下來的任何小拼寫錯誤寫出來。
感謝您提前提出任何想法!
-w00te
如果添加調試語句(在條件之前,拋出之前和之後)它會改變行爲嗎?如果你從圖片中取出矢量怎麼辦? GDB在用「catch throw」運行時會做什麼?你如何編譯?嘗試使用優化標誌 – nhed
按預期方式打印調試語句,但不會改變行爲。這是一個龐大的系統,它具有複雜的分層結構,並且在不同的部分使用了大量的標誌 - 但更重要的是,我們在任何你應該(或嘗試)的地方使用嘗試捕獲,並且之前沒有看到過這種情況。我想也許交叉編譯器可能會對範圍或類似的東西造成混亂,但我對編譯器知之甚少。我有幾個人看過去 - 我們可以通過做,而不是如果/拋出來解決它,但它是令人擔憂的是解決一些事情,不應該發生 –
我不知道,但可以考慮寫漁線作爲這* catch(const MyException&e)*可以避免爲MyException拷貝構造函數付費,因爲你會得到一個* throw *拋出的拷貝。 –