考慮一下:展開期間投擲 - 此示例爲何起作用?
void thrower() {
throw "123";
}
struct Catcher {
~ Catcher() {
try {thrower();}
catch (...) {}
}
};
int main() {
try {
Catcher c;
throw 1.23;
}
catch (...) {}
}
這編譯時和未GCC 4.3打電話terminate
運行,但according to the standard(15.5.1)
...當異常處理機制,完成後評價表達式被拋出,但在捕獲異常之前(15.1),調用通過未捕獲的異常退出的用戶函數... terminate應該被調用。
當雙已被拋出之後~Catcher
被調用,這是「在完成評估後...前的異常被捕獲」和thrower
是,這種滿足「其經未捕獲的異常退出用戶功能」上述條件。是的,char*
被捕獲,但之後只有用戶函數退出。
應該不是terminate
?
爲了強調這一點:
void do_throw() {
throw "123";
}
void thrower() {
do_throw();
// Uncaught exception here (A)
}
struct Catcher {
~ Catcher() {
try {thrower(); /* (B) */}
catch (...) {}
}
};
int main() {
try {
Catcher c;
throw 1.23;
}
catch (...) {}
}
(A)發生在(B),其已在進步異常的情況下。
那麼,不應該terminate
被稱爲?如果不是,這是一個法律情況,我們可以同時出現兩個例外情況,我們在哪裏畫線?
他問的問題是,在1.23被拋出,尚未抓到,另一項功能叫做拋出123不是由函數本身抓獲。所以根據標準,終止應該被調用。 – Shahbaz
@shabaz更新。 –