簡體   English   中英

為什么我的C ++異常沒有被捕獲?

[英]Why is my C++ exception not being caught?

我的代碼拋出std::runtime_error ,但是沒有在catch塊中捕獲它。 相反,它只調用std::terminate或者,如果我在函數上聲明了異常說明符,則調用std::unexpected

代碼簡化為:

void myfunc()
{
   throw new std::runtime_error("always throw");
}

int main()
{
    try {
        myfunc();
    } catch (std::runtime_error &err) {
        std::cerr << "intentionally ignored exception: " << err.what() << std::endl;
        return 0;
    }
    std::cerr << "unreachable?" << std::endl;
    return 1;
}

類似地,如果我在我的函數上添加一個throw說明符,我會使用std::unknown崩潰。

void myfunc() throw (std::runtime_error)
{
   throw new std::runtime_error("always throw");
}

你陷入了Java主義:

throw new std::runtime_error("always throw")
      ^^^

這會導致catch子句不匹配,因為它匹配類型並且你拋出std::runtime_error* ,即指向 std::runtime_error指針 它期待一個普通的std::runtime_error by-reference

您可以(未經測試)捕獲您的原始異常

catch (std::runtime_error * exc) /* don't do this */

但你不應該這樣做。

而是跳過new ; 直接拋出你的異常並寫:

void myfunc()
{
   throw std::runtime_error("always throw");
}

C ++足夠聰明,如果你通過引用捕獲異常,它將不會被復制。

另外,正如@KonradRudolph在評論中指出的那樣,你應該通過const-reference來捕獲:

catch (const std::runtime_error &err)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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