我有以下示例代码抛出#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。
答案 0 :(得分:1)
正如评论中所提到的,在C ++中,您不需要通过new分配异常,因此抛出指向异常的指针,就像在Java中一样。
相反,您只需构造异常并抛出它:
throw std::ios_base::failure( "Bonkers" );
然后catch子句的类型将匹配,程序将按预期运行。