为什么在 macOS M1 环境中没有使用 no-rtti 捕获“std::invalid_argument”?

Why `std::invalid_argument` is not caught with no-rtti in macOS M1 environment?

提问人:Alexander Gruzintsev 提问时间:11/15/2022 最后编辑:sideshowbarkerAlexander Gruzintsev 更新时间:11/16/2022 访问量:330

问:

今天我在捕获 C++ 异常时遇到了一个奇怪的行为,谁能向我澄清一下?代码截图

#include <iostream>
#include <string>
#include <exception>


int main() {
  try {
    std::stod("notanumber");
  } catch (const std::invalid_argument&) {
    std::cerr << "std::invalid_argument" << std::endl;
  } catch (const std::out_of_range&) {
    std::cerr << "std::out_of_range" << std::endl;
  } catch (const std::exception&) {
    std::cerr << "Caught by ancestor" << std::endl;
  } catch (...) {
    auto ptr = std::current_exception();
    auto type = __cxxabiv1::__cxa_current_exception_type();
    std::cerr << type->name() << std::endl;
    std::cerr << "..." << std::endl;
  }
  return 0;
}

写入输出

St16invalid_argument
...

环境详细信息

C++ 14, disabled RTTI
Clang 13.1.6 arm64-apple-darwin-21.6.0
macOS Monterey 12.6

我希望在第一个捕获块上捕获异常

已更新。即使是最简单的捕获也不适合我在环境中

try {
  std::stod("notanumber");
} catch (const std::invalid_argument&) { // not caught
  std::cerr << "std::invalid_argument" << std::endl;
}
C++ macOS C++14 标准 RTTI

评论

0赞 Alexander Gruzintsev 11/15/2022
打开 RTTI 后问题消失,但这对我来说仍然是一个问题
0赞 ALX23z 11/15/2022
没有 RTTI,就无法通过动态投射来压制。异常例程在捕获异常时很可能依赖于它。
0赞 Daniel Langr 11/15/2022
可能相关:discourse.llvm.org/t/....
2赞 Alexander Gruzintsev 11/15/2022
请参阅更新,即使是最简单的捕获invalid_argument在 mac m1 上也不起作用,但在 Intel 上运行良好。看起来像编译器错误
3赞 sebrockm 11/15/2022
我投票决定重新开放它。接近的原因根本没有意义。这在 Mac 上是完全可重复的,并且没有错别字导致它。

答: 暂无答案