[英]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.