为什么clang 4.0没有捕获std异常?

时间:2017-09-26 14:43:23

标签: c++ c++11 exception

我有以下示例代码抛出#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; } 并尝试捕获它,在c ++ 11模式下使用clang 4.0:

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

我编译这样的程序:

Anything

我得到了输出:

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

我原本希望能抓住特定的例外。我尝试使用g ++ 5.4,但结果相同。也试过没有c ++ 11标志,也没有帮助。取出catch all子句给我这个:

{{1}}

所以我错过了什么,我该怎么做才能解决这个问题?当我不使用c ++ 11标志时,也会显示abi:cxx11。

1 个答案:

答案 0 :(得分:1)

正如评论中所提到的,在C ++中,您不需要通过new分配异常,因此抛出指向异常的指针,就像在Java中一样。

相反,您只需构造异常并抛出它:

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

然后catch子句的类型将匹配,程序将按预期运行。