【发布时间】:2017-09-26 14:43:23
【问题描述】:
我有以下示例代码,它在 c++11 模式下使用 clang 4.0 抛出 std::ios_base::failure 并尝试捕获它:
#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。
【问题讨论】:
-
您正在抛出
std::ios_base::failure *并试图抓住std::ios_base::failure。它们不是同一类型。 -
将
throw new std::ios_base::failure( "Bonkers" );更改为throw std::ios_base::failure( "Bonkers" ); -
你的意思是
throw std::ios_base::failure( "Bonkers" ); -
我认为这值得保持开放。虽然这是一个简单的类型错误;这似乎不是印刷错误。这似乎是一个常见的错误,尤其是对于从 Java 等语言开始使用 C++ 的人来说。因此,我希望很多未来的 SO 用户会发现这很有用。
-
facepalm 谢谢,我在 Javaland 度过了过去三年,最近又回到了 C++。所以如果有人想制定一个答案,我很乐意接受。