【发布时间】:2013-11-26 09:25:49
【问题描述】:
我有一个方法:
void doSomethingMain(char* s)
{
doSomethingElse(s);
doMoreStuff(s);
}
doSomethingElse() 的方法是这样的:
void doSomethingElse(char* s)
{
anotherMethod(s);
moreStuff(s);
}
其中anotherMethod() 和moreStuff() 调用其他方法,而这些方法又可能返回doSomethingElse() 或moreStuff() 或其他方法......以非常递归的方式,但它们都没有调用main doSomethingMain() 方法。这是一个有限递归,它将在s 被成功使用时结束。这些方法是无效的,如果不付出巨大的努力,我们就无法改变它。
所有这些方法都在使用参数s,它们正在检查s 中的错误。我想要发生的情况如下:当调用堆栈中的某个方法在其输入参数(s)中遇到错误时,我想立即中止执行发现错误的函数,然后跳回doSomethingMain() 中的 doMoreStuff()。
显然,C++ 方法的直接解决方案之一是throw 和catch() 对,而C 方法是setjmp 和longjmp 对...但是我们的单元测试框架不喜欢 throw ... catch 对(它将它们解释为错误),我想避免 longjmp 方法,所以这里是问题:
为了在方法中中断应用程序的执行流程并在特定位置(方法之后的下一条语句)继续,我们还有哪些其他选择?
【问题讨论】:
-
这正是
longjmp()的用途,抱歉。然而,理论上你可以让你的所有函数都返回一个错误代码,然后所有对这些函数的调用都应该检查返回代码,当遇到错误时,任何函数都应该立即返回(使用相同的错误代码)。因此,一个错误将导致立即返回到第一个调用者(通过调用堆栈上的所有其他帧)。 -
真正的答案取决于您要使用的语言。现在是 C 还是 C++?
-
@H2CO3:很好。敢于回答! ;-)
-
@alk 谢谢,完成了。
-
我敢说投掷是完全你想要的正确解决方案(虽然我认为你想要的可能是错误的,
assert可能更适用于深度嵌套的递归函数发现它的输入参数是错误的——但这值得商榷)。无论如何,这是一种“错误,很少发生”的例外情况。正确调用析构函数,清除代码,工作不崩溃。为什么测试框架不喜欢异常?如果您确实捕获并且不重新抛出,则测试框架将永远无法看到它们。
标签: c++ c exception exit break