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

Why does clang 4.0 not catch std exceptions?

本文关键字:std 异常 clang 为什么      更新时间:2023-10-16

>我有以下示例代码,该代码在 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 标志,也无济于事。去掉所有包抄条款给了我这个:

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

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

如注释中所述,在C++中,您不需要像在 Java 中那样通过 new 分配异常,从而将指针指向异常。

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

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

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