如何记录函数可能抛出的所有异常?

2024-06-20

如果您有一个可能引发异常的公共函数,该函数使用其他(私有或公共)辅助函数也可能引发异常,我认为您应该记录公共函数可以引发哪些异常这包括辅助函数抛出的异常.

像这样(使用 Doxygen):

/** 
 * @throw Exception ...
 * @throw ExceptionThrownByHelper ...
 * @throw ExceptionThrownByHelpersHelper ...
 */
void theFunction() 
{ 
    helperWhichMayThrowException();
}

and helperWhichMayThrowException()还调用其他可能引发异常的函数。

为此,您可以:

  1. 递归地遵循所有函数theFunction()调用并查找该函数引发的异常。这是一项繁重的工作,当您向助手添加异常时,您可能会忘记在某处记录异常。
  2. 捕获助手抛出的所有异常theFunction()并转换它们,以便确保只抛出您指定的异常。但是为什么要使用异常呢?
  3. 不用担心辅助函数抛出的异常,但是您无法对所有异常进行单元测试,因为您不知道公共函数可以抛出哪些异常
  4. 有一些工具可以(半)自动列出助手等抛出的所有异常。我查看了 Doxygen 的文档,但没有找到执行此操作的方法。

我想使用选项 4,但我还没有找到好的解决方案,也许可以使用 Doxygen?或者也许我只是想记录太多???

edit:也许它不太清楚,但我正在寻找一种简单的方法来记录函数可能抛出的所有异常(最好使用 Doxygen),而无需手动检查所有辅助函数。一种简单的方法包括“不记录所有异常”或“捕获并转换所有异常”theFunction()'


从根本上讲,您所要求的几乎在所有现实情况下都是不可能的。

记录抛出的异常有两个部分。

1)简单一点。记录在您的方法中直接引发的异常。您可以手动完成此操作,但这非常费力,并且如果您未能使文档与代码保持同步,则文档会产生误导(可能比根本没有文档更糟糕,因为您只能真正信任您确定的文档100% 准确)。我的Atomineer实用工具 http://www.atomineerutils.com/加载项使这一点更容易实现,因为它以最少的努力使代码和文档注释保持同步。

2)不可能的部分。记录可能“通过”您的方法的所有异常。这意味着递归访问您的方法调用的方法的整个子树,以查看它们可能会抛出什么。为什么不可能呢?好吧,在最简单的情况下,您将静态绑定到已知方法,因此可以扫描它们以查看它们抛出的内容 - 相当简单。但大多数情况最终都会调用动态绑定方法(例如虚拟方法、反射或 COM 接口、DLL 中的外部库方法、操作系统 API 等),您无法明确地计算出可能会抛出什么(因为您不知道)在您实际在最终用户的 PC 上运行该程序之前,它被称为什么 - 每台 PC 都是不同的,并且在(例如)WinXP 和 Win7 上执行的代码可能会完全不同。或者想象您调用一个虚拟方法,然后有人添加一个插件- 在您的程序中重写该方法并引发新类型的异常)。可靠地处理这种情况的唯一方法是捕获方法中的所有异常,然后重新抛出特定的异常,然后可以精确地记录这些异常 - 如果您不能这样做,那么异常的文档几乎仅限于“通常在你的方法中抛出和通常预期的异常”,而“异常错误”基本上没有记录,只是简单地传递到更高级别的未处理异常捕获块。 (正是这种可怕的“未定义”异常行为常常导致需要使用catch(...)——从学术上来说它是“邪恶的”,但如果你希望你的程序是防弹的,有时你必须使用catch - 确保意外情况不会影响您的应用程序)。

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

如何记录函数可能抛出的所有异常? 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • c和java语言中的换行符

    现在行分隔符取决于系统 但在 C 程序中我使用 n 作为行分隔符 无论我在 Windows 还是 Linux 中运行它都可以正常工作 为什么 在java中 我们必须使用 n 因为它与系统相关 那么为什么我们在c中使用 n 作为新行 而不管我
  • 使用Physics.Raycast 和Physics2D.Raycast 检测对象上的点击

    我的场景中有一个空的游戏对象 带有 2D 组件盒碰撞器 我将脚本附加到该游戏对象 void OnMouseDown Debug Log clic 但是当我点击我的游戏对象时 没有任何效果 你有什么想法 如何检测我的盒子碰撞器上的点击 使用光
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 单元测试一起运行时失败,单独运行时通过

    所以我的单元测试遇到了一些问题 我不能只是将它们复制并粘贴到这里 但我会尽力而为 问题似乎是 如果我一项一项地运行测试 一切都会按预期进行 但如果我告诉它一起运行测试 则 1 5 将通过 TestMethod public void Obj
  • 如何访问另一个窗体上的ListView控件

    当单击与 ListView 所在表单不同的表单中的按钮时 我试图填充 ListView 我在 Form1 中创建了一个方法以在 Form2 中使用 并将参数传递给 Form1 中的方法 然后填充 ListView 当我调试时 我得到了传递的
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 批量更新 SQL Server C#

    我有一个 270k 行的数据库 带有主键mid和一个名为value 我有一个包含中值和值的文本文件 现在我想更新表格 以便将每个值分配给正确的中间值 我当前的方法是从 C 读取文本文件 并为我读取的每一行更新表中的一行 必须有更快的方法来做
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • Server.MapPath - 给定的物理路径,预期的虚拟路径

    我正在使用这行代码 var files Directory GetFiles Server MapPath E ftproot sales 在文件夹中查找文件 但是我收到错误消息说 给定物理路径但虚拟路径 预期的 我对在 C 中使用 Sys
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • memset 未填充数组

    u32 iterations 5 u32 ecx u32 malloc sizeof u32 iterations memset ecx 0xBAADF00D sizeof u32 iterations printf 8X n ecx 0
  • 检查Windows控制台中是否按下了键[重复]

    这个问题在这里已经有答案了 可能的重复 C 控制台键盘事件 https stackoverflow com questions 2067893 c console keyboard events 我希望 Windows 控制台程序在按下某个
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • React Material UI CardMedia 视频组件未播放

    我看到缩略图 但无法启动或停止视频 还有什么方法可以让它自动播放和重复吗 https material ui com api card media https material ui com api card media
  • 动态调整大小的 boost::asio::buffer

    我正在阅读boost asio ip udp socket像这样 using boost asio ip udp char recv buf 128 udp endpoint sender endpoint size t len socke
  • 在 C# 中使用 SHA1 算法进行哈希处理

    我想哈希给定byte 数组与使用SHA1算法与使用SHA1Managed The byte 哈希值将来自单元测试 预期的哈希值是0d71ee4472658cd5874c5578410a9d8611fc9aef 区分大小写 我怎样才能实现这个
  • 替换除引号内的逗号之外的逗号

    Date Time Ref Sen ATN Flow PCB temp Status Battery BC 2015 04 23 12 30 00 779581 908043 15 254 49 31 0 100 2015 04 23 12
  • 我应该如何使用 alias_method_chain 作为构建方法?

    我正在使用 Ruby on Rails 3 2 13 我想正确使用alias method chain build option name声明 因为我收到一个奇怪的错误 那是 在我的控制器文件中我有 class Articles Comme
  • 数据协定中的 IsReference 属性

    目的是什么IsReference财产在DataContract 应用此属性后 请求和响应有何变化 它决定对象如何序列化 默认情况下 IsReference false Setting IsReference true允许对可以互相引用的对象
  • Chrome 扩展屏幕截图部分图像裁剪适用于 Retina 显示屏

    我制作了一个 chrome 扩展 它捕获网站的单个元素 div 我使用 chrome tabs gt captureVisibleTab 来制作屏幕截图 然后 使用元素 div 的坐标 x y 和大小 宽度 高度 裁剪屏幕截图 这对我来说在
  • 有没有办法使用 Python Pandas 读取所有行,直到遇到空行

    我在 Excel 中有很多行 并且这些行在空行之后填充有垃圾值 有没有办法使用 Python pandas 只读取 Excel 中第一个空行之前的记录 我不知道 read excel 是否可以做到这一点 如果您从 Excel 导入空行 这些
  • 如何为单集群(独立集群)ElasticSearch 配置单节点

    我在本地计算机上安装了elasticsearch 我想将其配置为集群中唯一的一个节点 独立服务器 这意味着每当我创建新索引时 它只能用于我的服务器 它将无法被其他人的服务器访问 我当前的情况是 这些索引可供其他服务器使用 这些服务器形成在集
  • 限制特定用户对特定资源的点到站点 Azure VPN 访问

    有没有办法限制某些点到站点用户对 Azure 资源的访问 例如 我希望允许 P2S VPN 用户可以访问一台虚拟机但不能访问另一台虚拟机 或者允许访问一个子网但不能访问其他子网 现在看来 一旦您进入 您就可以享受 VNET 可以访问的所有内
  • virtualenv:错误:需要以下参数:dest

    我无法在我的 macbook pro 上安装和配置 python3 虚拟环境 我试图为我的下一个项目安装并尝试 django 但这里开始出现问题 在目录中安装虚拟环境 在主目录root中添加以下命令来创建环境 python3 m venv
  • 使用外部存储,删除文件夹时出错

    我正在使用 docker nextcloud 我创建了一个干净的实例 我想使用应用程序外部存储 我设法使用以下命令成功配置本地存储 mount id docker exec user 1000 nextcloud php occ files
  • SQLite中的ROWID是自动设置的吗?

    所以 我在 Ionic 上有这个应用程序 它使用SQLite ngCordova 插件 https github com litehelpers Cordova sqlite storage用于内部存储 在其上 我使用以下命令创建一个表 d
  • 更改 django 中的项目名称

    我将 django 项目的名称从oldname to newname使用 Pycharm 的重构 gt 重命名 我翻遍了这个项目 似乎到处都改了名字 但是当我尝试 runserver 时 这就是我得到的 Traceback most rec
  • 如何测试 httpOnly cookie 标志

    我在 websphere 中为 jsessionid cookie 设置了以下属性com ibm ws webcontainer HTTPOnlyCookies 知道如何在 Firefox 或 IE 中使用 JavaScript 进行最佳测
  • 伊德里斯统一意外失败

    我正在尝试在 Idris 中创建一个所谓的可判定解析器 起初我只是想解析自然数 但遇到了一个意想不到的问题 生成它的代码的最小示例如下 data Digit Char gt Type where Zero Digit 0 One Digit
  • 游戏如何制作火焰和烟雾效果? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在互联网上搜索了有关粒子系统和火焰
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 如何记录函数可能抛出的所有异常?

    如果您有一个可能引发异常的公共函数 该函数使用其他 私有或公共 辅助函数也可能引发异常 我认为您应该记录公共函数可以引发哪些异常这包括辅助函数抛出的异常 像这样 使用 Doxygen throw Exception throw Except