我正在用C++編寫程序。該程序一直在爲Win32(x86)正常工作,最近我試圖編譯它原生的x64。當然,東西沒有馬上工作。MSVC x64中的C++異常「跳過」Try-Catch子句
調試問題後,我設法與這個簡單的代碼片段重現它:
class MyException { };
int main()
{
try {
for (;;) {
try {
std::cout << "Throwing" << std::endl;
throw MyException();
if (1 == 0) {
continue;
}
} catch (const MyException&) {
std::cout << "Catch 1" << std::endl;
}
}
} catch (const MyException&) {
std::cout << "Catch 2" << std::endl;
}
std::cout << "Done" << std::endl;
return 0;
}
(我會解釋很快if (1==0)
條款)
編譯時使用MSVC此代碼x86(我用過2010),結果如預期:
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
Throwing
Catch 1
...
等等,在一個無限循環。
然而,在編制用於基於x64的結果驗證碼:
Throwing
Catch 2
Done
例外完全跳過內catch子句!
這隻發生在我的代碼中存在if (1 ==0)
子句時。當我刪除它時,異常將按預期捕捉到「Catch 1」。
我用其他的編譯器嘗試:
- 此錯誤也如預期發生在2012年VS
- 的MinGW和MinGW-W64的工作。
我的問題:這是一個MSVC錯誤,或者這是一些未定義的行爲在C++我失蹤了? 如果這確實是一個MSVC錯誤,我很樂意聽到關於原因的一些見解。
謝謝。
幾乎可以肯定是編譯器錯誤,如果你在文件MS連接錯誤報告(你可以鏈接這個問題),並離開這裏的鏈接,那麼我會給予好評的。很高興看到微軟工程師對此有何評論。 –
很好找!我剛剛走了。首先,它在64位發行版上崩潰鏈接器。其次,我可以用「繼續」來重現它。圍繞它的'if'語句是不必要的。使用VS2012更新3. – Steve
我已經在[MS Connect]上打開了一個錯誤報告(https://connect.microsoft.com/VisualStudio/feedback/details/806490/c-exception-skips-try-catch-clause-in -msvc-x64)的。 –