【发布时间】:2011-05-30 14:40:39
【问题描述】:
如果你有一个可能抛出异常的公共函数,它使用其他(私有或公共)辅助函数也可能抛出异常,我认为你应该记录公共函数可以抛出哪些异常,这包括由辅助函数。
类似这样的东西(使用 Doxygen):
/**
* @throw Exception ...
* @throw ExceptionThrownByHelper ...
* @throw ExceptionThrownByHelpersHelper ...
*/
void theFunction()
{
helperWhichMayThrowException();
}
而helperWhichMayThrowException() 还调用了其他可能引发异常的函数。
为此,您可以:
- 递归跟踪所有函数
theFunction()调用并查找该函数抛出的异常。这是一项繁重的工作,当您向帮助程序添加异常时,您可能会忘记在某处记录异常。 - 在
theFunction()中捕获助手抛出的所有异常并转换它们,这样您就可以确定只抛出您指定的异常。但是为什么要使用异常呢? - 不用担心辅助函数抛出的异常,但是您不能对所有异常进行单元测试,因为您不知道公共函数会抛出哪些异常
- 有一些工具可以(半)自动列出助手等抛出的所有异常。我查看了 Doxygen 的文档,但没有找到执行此操作的方法。
我想使用选项 4,但我还没有找到好的解决方案,也许使用 Doxygen 可行?或者我只是想记录太多???
编辑:也许它不是很清楚,但我正在寻找一种简单的方法来记录函数可能抛出的所有异常(最好使用 Doxygen),而无需手动检查所有辅助函数。一种简单的方法包括“不记录所有异常”或“捕获并转换theFunction() 中的所有异常”
【问题讨论】:
-
通常假设某个异常可以被抛出是有意义的,但也可以假设它不会被抛出。例如,考虑
std::bad_alloc。您应该始终假设它可能被许多操作抛出,例如动态分配或容器操作,并且您应该使用 RAII 进行防御性编码。但是,这并不意味着您需要为它到处放置处理程序,因为在大多数应用程序中,您极不可能看到它,而且当它确实发生时,您不太可能从中恢复它没有很多麻烦。 -
@James McNellis:好的,对于某些异常,这是有道理的,但是某个助手抛出的 NoPermission 异常呢?
-
为什么要记录异常?它使所有关于异常的想法都变得毫无用处。另请阅读为什么异常规范无用。
-
您应该根据输入定义函数的行为,如果这意味着必须记录一些辅助函数异常,那很好。请注意,由于违反函数中的某些不变量而引发的异常可能不需要记录——事实上,在调用其他可能引发的代码之前,最好先
assert。 -
@ybungalobill:我同意@rve 记录异常。程序其余部分的正确性取决于处理这些异常的系统。
标签: c++ exception documentation doxygen