c++ throw with try catch all always hits 在 C++ 11 14 和 17 中终止

Posted

技术标签:

【中文标题】c++ throw with try catch all always hits 在 C++ 11 14 和 17 中终止【英文标题】:c++ throw with try catch all always hits terminate in C++ 11 14 and 17 【发布时间】:2020-09-03 20:30:01 【问题描述】:

我不断收到终止调用我使用 GCC 9.2 抛出的任何内容,即使它被捕获。

terminate called after throwing an instance of 'char const*'
terminate called recursively

我测试过 -std=c++17, -std=c++14, -std=c++11

示例测试:

#include <iostream>

int main()

  try
  
      throw "not found";
  
  catch(...)
  
    std::cout << "test" << std::endl;
  

  return 0;

如果我使用 Visual Studio 或多个在线编译器进行编译,它不会失败。 例子: https://repl.it/languages/cpp https://www.onlinegdb.com/online_c++_compiler

我也尝试过将 throw 放入一个函数并添加 noexcept(false),但这也失败了。示例:

#include <iostream>

void foo() noexcept(false)

    throw std::runtime_error( "test1" );


int main()

  try
  
      foo();
  
  catch(...)
  
    std::cout << "test2" << std::endl;
  

  return 0;

编辑:

系统信息:

我正在使用 9-2020-q2-update - arm-linux-none-gnueabihf。

基本上,设置是 Linux x86 作为我的主计算机,针对 ARM Cortex-A 处理器进行交叉编译。我正在测试的处理器是 Raspberry Pi 4 和 BeagleBone Black。

代码可以正确编译并且在目标处理器上运行良好,除非遇到异常。在这一点上,它会因任何抛出而终止。

我使用 Eclipse 作为 IDE,使用远程调试上传和单步执行任一目标处理器上的代码。

【问题讨论】:

请添加有关您获得此结果的系统的详细信息。 我已经尝试过repl.it 和 Godbolt,两者都完全按照应有的方式打印出 test。您的代码没有问题,但可能与您的编译器标志有关。 是的,我也是这么想的。它必须是缺少编译器标志或其他东西。我试过-fexceptions,但这没有用。 @user2654735 你能复制它here吗? 【参考方案1】:

似乎有一个错误或异常处理不适用于 GCC 9.2 版(仅限 ARM?)编译器。

我尝试使用版本 8.3-2019.03 - arm-linux-gnueabihf - Linux x86 编译器,它们运行良好。除了编译开关之外,无需进行其他更改。

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

【讨论】:

以上是关于c++ throw with try catch all always hits 在 C++ 11 14 和 17 中终止的主要内容,如果未能解决你的问题,请参考以下文章

C++ --- C++异常处理(try catch throw)

C++异常如何写

C++异常如何写

SqlDataReader 和 T-SQL:在使用来自 C# 的“异步”调用时使用“try...catch”和“throw”时不会传播异常

java异常 throw和try-catch的关系

JAVA语言如何进行异常处理,关键字throws,throw,try,catch,finally分别代表啥意义在try块中抛出异常吗