c++ - 无法捕获自定义 std::runtime_error

标签 c++ exception clang

在我的代码中,我抛出了自定义 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 block 捕获。

更新2:

根据与上面测试代码相同的文件中的 file_error 声明自己的错误,如下所示:

class test_error : base::file_error {

public:
  test_error(const std::string &s) : base::file_error(s, 0) {};
};

允许我在 test_error block 和 catch-all block 中捕获它,但不能在 base::file_error、std::runtime_error 或 std::exception block 中捕获它。奇怪。

更新3:

经过大量实验,我现在认为这是一个类型不匹配问题,类似于 ODR 违规,但类型不同。 dylib 和测试应用程序中的类型不被视为相同,因此不会捕获异常,除非我直接在测试代码中抛出该 base::file_error 异常。

最佳答案

class test_error : base::file_error 

allows me to catch it in a test_error block and in a catch-all block, but not in base::file_error, std::runtime_error or std::exception blocks.

您的异常类需要从基本异常类公开派生。否则你将无法通过基类捕获它们:

class test_error : public base::file_error 

关于c++ - 无法捕获自定义 std::runtime_error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31000301/

相关文章:

c++ - 模板化虚函数,管理来自单个类的不同类属性

c# - 在 catch block 中返回?

c++ - 解析 C++ 以生成代码的最简单方法是什么?

Clang 链接器和 i686

c# - 索引超出范围异常和索引超出数组边界异常有什么区别?

Mavericks 升级后 OS X 上的 C++ 编译问题

c++ - 无法识别的命令行选项 '-Zc:__cplusplus' 和无法识别的命令行选项 '-permissive-'

c++ - 不递归分配多维数组

c++ - 调用 'this->template [somename]' 有什么作用?

python - Celery 错误地传播异常