【问题标题】:Why does clang 4.0 not catch std exceptions?为什么 clang 4.0 不能捕获 std 异常?
【发布时间】: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++。所以如果有人想制定一个答案,我很乐意接受。

标签: c++ c++11 exception


【解决方案1】:

如 cmets 中所述,在 C++ 中,您不需要像在 Java 中那样通过 new 分配异常并因此抛出指向异常的指针。

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

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

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

【讨论】:

    猜你喜欢
    • 2014-11-24
    • 1970-01-01
    • 2021-03-16
    • 2012-08-27
    • 2013-10-26
    • 2021-05-13
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    相关资源
    最近更新 更多