如果您有一个可能引发异常的公共函数,该函数使用其他(私有或公共)辅助函数也可能引发异常,我认为您应该记录公共函数可以引发哪些异常这包括辅助函数抛出的异常.
像这样(使用 Doxygen):
/**
* @throw Exception ...
* @throw ExceptionThrownByHelper ...
* @throw ExceptionThrownByHelpersHelper ...
*/
void theFunction()
{
helperWhichMayThrowException();
}
and helperWhichMayThrowException()
还调用其他可能引发异常的函数。
为此,您可以:
- 递归地遵循所有函数
theFunction()
调用并查找该函数引发的异常。这是一项繁重的工作,当您向助手添加异常时,您可能会忘记在某处记录异常。
- 捕获助手抛出的所有异常
theFunction()
并转换它们,以便确保只抛出您指定的异常。但是为什么要使用异常呢?
- 不用担心辅助函数抛出的异常,但是您无法对所有异常进行单元测试,因为您不知道公共函数可以抛出哪些异常
- 有一些工具可以(半)自动列出助手等抛出的所有异常。我查看了 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(使用前将#替换为@)