2017-09-26 22 views
0

我已經拋出一個std::ios_base::failure並試圖抓住它,在C++ 11模式中使用鐺4.0以下示例代碼:爲什麼叮噹4.0不捕捉std異常?

#include <ios> 
#include <iostream> 
#include <stdexcept> 

int 
main() 
{ 
    try { 
    throw new std::ios_base::failure("Bonkers"); 
    } 
    catch(std::ios_base::failure &e) { 
    std::cout << "Failure " << e.what() << std::endl; 
    } 
    catch(...) { 
    std::cout << "Anything" << std::endl; 
    } 
    return 0; 
} 

予編譯程序這樣的:

clang++-4.0 --std=c++11 -g -W -Wall ex.cc -o ex 

而我得到的輸出:

Anything 

我會期待它捕捉到特定的異常。我嘗試了g ++ 5.4,但結果相同。也嘗試沒有C + + 11標誌,也沒有幫助。拿出catch all條款給我這個:

terminate called after throwing an instance of 'std::ios_base::failure[abi:cxx11]*' 

那麼我錯過了什麼,我能做些什麼來解決這個問題?當我不使用C++ 11標誌時,abi:cxx11也顯示出來。

+8

你正在拋出一個'std :: ios_base :: failure *'並試圖捕獲一個'std :: ios_base :: failure'。那些不是同一類型。 – nwp

+2

更改'拋出新的std :: ios_base :: failure(「Bonkers」);'拋出std :: ios_base :: failure(「Bonkers」);' –

+3

你的意思是拋出std :: ios_base :: failure(「 Bonkers「);' –

回答

1

正如在註釋中提到的那樣,在C++中,您不需要通過new來分配異常,因此將指針指向異常,就像在Java中所做的那樣。

相反,你只需構造異常,並把它:

throw std::ios_base::failure("Bonkers"); 

然後類型的catch子句將匹配,並計劃將像預期的那樣。