无法捕获自定义std::runtime_error
Cannot catch custom std::runtime_error
在我的代码中,我抛出了自定义的file_error异常,该异常源自std::runtime_error。在另一个模块中,我捕捉到该操作的异常,并希望处理我的file_error,如下所示:
try
{
base::create_directory(INVALID_NAME, 0700);
...
}
catch (const base::file_error &exc)
{
...
}
catch(std::runtime_error &exc)
{
...
}
catch(std::exception &exc)
{
...
}
file_error声明为:
namespace base {
class file_error : public std::runtime_error
{
int sys_error_code;
public:
file_error(const std::string &text, int err);
error_code code();
int sys_code();
};
}
但是,file_error的catch分支从未被触发。要么我最终进入runtime_error分支,要么如果我删除了它,则进入异常分支。
然而,这在Linux+Win(gcc,VS)中运行良好,而在Mac(clang)上则不起作用。知道这里可能出了什么问题吗?
更新:
以下是当我到达runtime_error分支时的lldb输出:
(lldb) p exc
(const base::file_error) $0 = {
std::runtime_error = {
__imp_ = (__imp_ = 0x0000000000000000)
}
sys_error_code = 13923331
}
这清楚地表明异常的类型确实是base::file_error。它只是没有被关联的catch块捕获。
更新2:
在与上面的测试代码相同的文件中基于file_error声明自己的错误,如下所示:
class test_error : base::file_error {
public:
test_error(const std::string &s) : base::file_error(s, 0) {};
};
允许我在test_error块和catch-all块中捕获它,但不能在base::file_error、std::runtime_error或std::exception块中捕获。奇怪的
更新3:
经过大量的实验,我现在认为这是一个类型不匹配的问题,类似于ODR冲突,但不同。dylib和测试应用程序中的类型被认为不相同,因此不会捕获异常,除非我在测试代码中直接抛出base::file_error exeption。
class test_error : base::file_error
允许我在test_error块和catch-all块中捕获它,但不能在base::file_error、std::runtime_error或std::exception块中捕获。
您的异常类需要从基本异常类公开派生。否则,您将无法通过基类捕获它们
class test_error : public base::file_error
此问题的解决方案是避免在测试应用程序中使用编译器选项-fvisibility=hidden
(或将其设为默认选项)。点击此处了解更多信息:https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#Code-Gen选项。特别是这部分:
请注意,-fvisibility确实会影响C++模糊链接实体。这意味着,例如,在DSO必须显式标记为默认可见性,以便"type_info"节点在DSO之间是统一的。
这些技术、它们的优点以及如何使用它们的概述如下在http://gcc.gnu.org/wiki/Visibility.
- "error: no matching function for call to"构造函数错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- C++错误:"error: int aaa::bbb is protected within this context"
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- C++,在int数组中输入字符串或字符会输出0,而不是ascii或error
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- C++ "error: invalid use of void expression"
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- "runtime error: addition of unsigned offset to 0x129000a0 overflowed to 0x12900088"
- 为什么我的代码中出现'Runtime Error - SIGSEGV'?
- C++ dynamic_cast runtime-error
- 错误"Runtime error"
- 如何修复不影响性能的"runtime error"?
- 谁能告诉我为什么它显示"runtime error"?
- Lua+Luabind,"runtime error"后堆栈顶部没有错误信息
- 如何解决C代码中"runtime error exitcode 6"报告的错误?
- 在范围结束后提升共享指针"runtime error"
- C++ 'Runtime error time: 0 memory: 3452 signal:11'