【问题标题】:How to replace dynamic exception specifications: throw(...)如何替换动态异常规范:throw(...)
【发布时间】:2019-01-17 15:37:04
【问题描述】:

我正在开发一个使用旧库的项目,该库使用像

这样的函数定义
void func() throw(some_exception);

由于dynamic exception specifications 在 C++17 中被删除,我想知道如何解决这个问题。

  1. P0003R0建议更换

    void func() throw(some_exception)
    {
        /* body */ 
    }
    

    类似的东西

    void func()
    {
        try
        {
            /* body */
        }
        catch(const some_exception&) {
           throw;
        }
    }
    

    但是,我无权访问源代码(只有头文件)。

  2. 所以我只能尝试“修复”标题中的函数定义。所以例如我可以写

    void func() noexcept(false);
    

    但是当函数抛出异常时,我的应用程序仍然终止。

如何更改头文件中的函数定义或调整我自己的项目(我使用 func 的地方)以获得与 C++17 之前 throw(some_exception) 相同的行为?

【问题讨论】:

  • 我看不到使用 try/catch 的替换添加了什么。也许添加一个catch(...) { std::terminate(); } 或者更接近初衷的东西。
  • void func() noexcept(false); 应该可以工作。如果您的应用程序正在终止,则可能是您未能捕捉到预期,并且调用堆栈一直回退到顶部而没有找到合适的处理程序。
  • 请为 2) 案例做一个最小的测试用例。
  • @Phil-ZXX 请分享minimal reproducible example。如果更改不起作用,则问题可能比问题所暗示的更复杂,并且涉及此处未显示的代码。
  • func 是否在预编译库中?它是如何编译的,你是如何编译你的代码的?这可能是 ABI 问题。在混合以不同方式编译的二进制文件时,C++ 并不总是能很好地发挥作用。

标签: c++ exception c++17 throw


【解决方案1】:

只需删除动态异常规范。这就是您需要做的所有事情。

C++ 不是 Java;在 C++ 中,所有函数(在语言级别)都假定抛出任何东西,除非它们被标记为 noexcept。因此,如果您删除异常规范,它将完全像以前一样工作。

【讨论】:

  • OP 说他/她尝试用noexcept(false) 替换它,这是几乎所有情况下的默认设置。所以看来他/她已经尝试过了。除非有关于 noexcept(false) 的某些内容会导致根本没有异常规范起作用的问题。
  • @FrançoisAndrieux:“OP 说他/她尝试用 noexcept(false) 替换它,这是几乎所有情况下的默认设置。” 是吗?在 C++17 中,对函数类型系统进行了更改,以在函数类型中包含 noexcept 状态。现在,我还没有阅读它的详细信息,但 可能noexcept(false) 放在那里会影响 ABI,而放什么都不应该是 ABI 中性的。
猜你喜欢
  • 2013-01-14
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-15
  • 1970-01-01
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多