2012-02-13 91 views
0

在我期望它們被捕獲的情況下,異常沒有被捕獲。該代碼在1 cpp文件中的1個函數中,該文件通過GCC 4.2編譯爲靜態庫,然後鏈接到Cocoa應用程序中。有問題的代碼是C++派生類異常沒有被基類捕獲

class runtime_error : public exception{ 
// More code 
}; 


int foo(void){ 
    try { 
     if(x == 0){ 
      throw std::runtime_error("x is 0"); 
     } 
    } 
    catch(std::exception & e){ 
    // I expect the exception to be caught here 
    } 
    catch(...){ 
     // But the exception is caught here 
    } 
} 

我可以修改代碼以

int foo(void){ 
    try { 
     if(x == 0){ 
      throw std::runtime_error("x is 0"); 
     } 
    } 
    catch(std::runtime_error & e){ 
    // exception is now caught here 
    } 
    catch(…){ 
    } 
} 

代碼的第二個版本只解決了可能從性病導出爲runtime_error例外,而不是其他異常類問題::例外。任何想法有什麼不對? 請注意,代碼的第一個版本在Visual Studio中可以正常工作。

感謝,

巴里

+0

當你已經存在一個定義自己的'runtime_error'類的時候,是否有任何理由? – templatetypedef 2012-02-13 17:53:19

+1

應該發現異常。 http://ideone.com/dl0Dm更新您的GCC並查看錯誤是否仍然發生 – Kos 2012-02-13 17:55:07

+0

您向我們顯示的代碼未編譯。請提供一個簡短的,完整的完整示例。 http://sscce.org – 2012-02-13 17:58:23

回答

1

書面您的代碼不編譯。當我按照如下所示更改它以添加所需的包含,變量等時,它按預期打印「異常」(g ++ 4.2和4.5)。你能告訴我們完整的真實代碼這是造成你的問題?

#include <exception> 
#include <stdexcept> 
#include <iostream> 

int x = 0; 

int foo(void){ 
    try { 
     if(x == 0){ 
      throw std::runtime_error("x is 0"); 
     } 
    } 
    catch(std::exception & e){ 
     // I expect the exception to be caught here 
     std::cout << "exception" << std::endl; 
    } 
    catch(...){ 
     // But the exception is caught here 
     std::cout << "..." << std::endl; 
    } 

    return 0; 
} 

int main() 
{ 
    foo(); 

    return 0; 
} 
+0

下面是一些代碼,我剛纔測試了其運行的和最初描述的方式失敗:\t \t的#include 「stdafx.h中」 \t INT FOO(無效) \t { \t \t嘗試{ \t \t \t throw std :: runtime_error(「Error」); \t \t \t return 0; \t \t} \t \t趕上(標準::例外&E){ \t \t \t返回1; \t \t} \t \t catch(...){ \t \t \t return 1; \t \t} \t} – Barrie 2012-02-13 23:58:43

0

您的類runtime_error是在您的代碼的名稱空間中定義的類。我不確定你爲什麼會用std::作爲範圍解析運算符?

是不是應將線throw std::runtime_error("x is 0");更改爲throw runtime_error("x is 0");

+0

std :: runtime_error的定義存在一些混淆。我實際上沒有定義它。我只是表明它是從std :: exception公開派生出來的,因此應該捕獲異常。 – Barrie 2012-02-13 23:57:49