【发布时间】:2019-01-17 15:37:04
【问题描述】:
我正在开发一个使用旧库的项目,该库使用像
这样的函数定义void func() throw(some_exception);
由于dynamic exception specifications 在 C++17 中被删除,我想知道如何解决这个问题。
-
P0003R0建议更换
void func() throw(some_exception) { /* body */ }类似的东西
void func() { try { /* body */ } catch(const some_exception&) { throw; } }但是,我无权访问源代码(只有头文件)。
-
所以我只能尝试“修复”标题中的函数定义。所以例如我可以写
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++ 并不总是能很好地发挥作用。