当类定义不可见时捕获异常

2023-12-01

我正在解决一个问题,即损坏的输入文件导致抛出异常。异常类是在实现文件中定义的,因此对我来说是不可见的。它确实继承自std::exception.

我尝试简单地向前声明异常类,因为我只是通过引用捕获它。然而,这给了我一个error: invalid use of incomplete type编译器错误(在 Linux 上使用 GCC 6.2)。我认为编译器需要完整的异常对象类型,以便它可以在需要时重新抛出异常。

所以这就是我想做的:

// library.cpp

namespace FOO {

struct SomeException : public std::exception
{
    // string member, virtual dtor, ctor taking one arg and virtual what()
};

void doStuff() {
}

}


// my main.cpp
namespace FOO
{
   struct SomeException;
}

int main()
{
    try
    {
        FOO::doStuff();
    }
    catch (FOO::SomeException& e)
    {
        // ignore e, but I know where it came from so log
        // an appropriate message
    }
    catch (std::exception& e)
    {
        // most other exceptions, log `what()` message
    }
    catch(...)
    {
        // tell user to contact customer support
    }
}

只需打印what()消息不适合我的上下文。

我可以要求其他团队将他们的异常类定义移至标头中。这可能会是一个缓慢的过程。我想我也可以对what()消息,但这看起来很难看。

还有其他选择吗?

(顺便说一句,我在谷歌上看不到任何提及这一点的信息,但这似乎确实是一种反模式,即“仅抛出异常”)。


如果您无权访问原始类,您将无法正确捕获它:

C++ 标准/[except.handle]:

The 异常声明 in a handler描述了以下类型 可能导致该情况的异常handler被输入。 这异常声明不得表示不完整类型、抽象类类型或右值引用类型。 这异常声明不得表示对不完整类型的指针或引用,[ 除外cv void*].

所以没有理想且干净的解决方案。但也许是一个可以接受的解决方法:派生自的类std::异常是多态的。所以你可以考虑使用typeid()(最终结合type_index)来识别真实类型catch (std::exception& e)堵塞。

恕我直言,这应该是区分未知异常的一种可接受的方法.what()不是替代方案。然而,不便的是,type_info数据(例如typeid(e).name()) 未在标准中定义,这使得任何硬编码值都不可移植。

概念证明:

//somewhere
class MyExcept : public std::exception { };

...

// somewhere else
try {
    throw std::exception();
} catch (std::exception &e) {
    std::cout <<"case 1: " << typeid(e).name() << std::endl;
}

try {
    throw MyExcept();
} catch (std::exception &e) {
    std::cout <<"case 2: "<< typeid(e).name() << std::endl;
}

在线演示

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当类定义不可见时捕获异常 的相关文章

随机推荐

  • AsyncTask - 扩展和 doInBackground 需要哪些参数?

    这段使用 AsyncTask 的代码有什么问题 尤其 我需要在 fetchSchools 中放入哪些参数 我需要在 doInBackground 中放入哪些参数 我发现了很多 有用 的示例 但它们都在这些参数中使用伪代码 并且没有解释我实际
  • 通过深度 HashMap 递归迭代

    我有一个类似于以下内容的 JSON 字符串 foo bar id 1 children some string id 2 children some string id 2 children 我对该字符串进行 JSON 解析 将所有对象转换
  • 循环更新 mayavi 绘图

    我想做的是循环更新 mayavi 图 我希望绘图的更新在我指定的时间完成 与动画装饰器不同 因此 我想要运行的一段示例代码是 import time import numpy as np from mayavi import mlab V
  • 当函数没有被前向声明时,GCC 在编译器阶段不会抛出错误

    Ok 我的目录中有 3 个文件 main c include
  • 如何使用 sklearn.datasets.load_files 加载数据百分比

    我正在加载 8000 张图像sklearn datasets load files并通过 resnet 从keras以获得瓶颈特征 然而这个任务在 GPU 上需要花费几个小时 所以我想知道是否有办法告诉load files加载一定百分比的数
  • Jersey:在不使用 web.xml 文件的情况下禁用 OPTIONS 请求的自动 Wadl 生成?

    我想完成与这个问题相同的事情 禁用 OPTIONS 请求的自动 Wadl 生成 但我们没有web xml文件 我们还利用ResourceConfig 其中getProperties方法是最终的 所以我不能按照中的建议覆盖它其他问题 我试过打
  • 为什么将 D3 源复制到 Angular 服务中?

    我尝试将 d3 使用到一个有角度的项目中 如主要示例之一中提到的NG通讯 其中展示了如何在 Angular 中设置 D3 服务 我想知道将 D3 作为 Angular 服务如何与 Angular yeoman 和 Bower 配合良好 还是
  • 水文年时间序列

    目前我正在研究河流流量数据分析 我有从1935年至今的每日出院记录 我想提取每个水文年的年度最大流量 从 01 11 开始到明年 31 10 然而 我发现HydroTSM包只能处理自然年 我尝试使用 zoo 包 但我发现它很难计算 因为每年
  • XSD 用于带有 HREFLANG 的站点地图

    我们正在推出一个支持 20 种语言和大量区域内容 即针对特定国家或一组国家的内容 的主要网站 因此 我们有一个在站点地图中使用 xhtml link 和 rel hreflang 的教科书用例 我们通常更喜欢从 XSD 生成类 以便我们可以
  • 生成两个具有相同maven项目的jar

    我想在执行 mvn clean install 时从同一个 Maven 项目生成两个 jar 两个罐子之间的唯一区别是内容META INF folder 目前 我已经我的应用程序 jar 我现在想要my jar xxx jar and 我的
  • 如何对主键重新排序?

    我有一个包含 5700 条记录的表 主键是一个整数 现在我注意到缺少一些值 像这样 100 data 101 data 102 data 104 data 103不见了 我如何更新所有行以使顺序正确 104变成103在我的示例中 在一个 S
  • 无法加载文件或程序集“AjaxControlToolkit”或其依赖项之一。该系统找不到指定的文件

    我已经使用我的 Visual Studio 安装了 AJAXcontrolsToolkit 并将 Combobox Ajaxcontrol 控件放置在我的网页中 当我编译代码时出现以下错误 无法加载文件或程序集 AjaxControlToo
  • 如何将云存储上的文件中的 json 导入到 Bigquery

    我正在尝试通过 api 将文件 json txt 从云存储导入到 Bigquery 但抛出错误 当通过网络用户界面完成此操作时 它可以正常工作并且没有错误 我什至设置了 maxBadRecords 0 有人可以告诉我我在这里做错了什么吗 代
  • 预加载的声音被卸载?

    所以 我有以下测试代码
  • 在 JavaScript 中使用“<”和“>”运算符比较两个字符串

    比较运算符如 gt and lt return Boolean当它们的输入作为两个字符串值给出时的值 我尝试了几个例子 String vs String console log firstName lt lastname true cons
  • PHP 中的 DOM:解码实体并设置 nodeValue

    我想使用 PHP 对 XML 文档执行某些操作DOM其标准库的一部分 正如其他人已经发现 然后就必须处理解码的实体 为了说明困扰我的问题 我举一个简单的例子 假设我们有以下代码 doc new DOMDocument doc gt load
  • Android 将文件保存到外部存储

    我在 Android 应用程序上创建目录并将文件保存到其中时遇到了一些问题 我正在使用这段代码来执行此操作 String filename MyApp MediaTag MediaTag objectId png File file new
  • 如何修复-没有这样的表:main.auth_user__old

    有人可以详细解释如何修复ERROR no such table main auth user old 当我尝试将数据添加到我的注册模型时 它会出现在我的 Django 应用程序中 我已经使用以下方法解决了这个问题 1 删除db sqlite
  • 标准化向量?

    如何标准化一个 M N 向量 使其所有元素的总和等于 1 我在网上浏览了一下 似乎没有什么完全符合我的需要 谢谢 将所有元素相加 然后将每个元素除以总和 显然 除法 至少 需要采用浮点数 由于这表示浮点矩阵 因此在保持最大精度的同时进行求和
  • 当类定义不可见时捕获异常

    我正在解决一个问题 即损坏的输入文件导致抛出异常 异常类是在实现文件中定义的 因此对我来说是不可见的 它确实继承自std exception 我尝试简单地向前声明异常类 因为我只是通过引用捕获它 然而 这给了我一个error invalid