在C ++中终止函数的最简单方法

时间:2013-12-14 13:18:36

标签: c++ error-handling terminate

我想知道在C ++中终止函数的最简单或最方便的方法。

例如我有int function()并且我希望它在函数中的某些条件下什么都不做(有点像无效),但我不希望整个程序终止。所以,请不要“退出”:D。

我看到人们使用return;,但我不确定它是否安全。

希望你能帮助我。谢谢!

6 个答案:

答案 0 :(得分:3)

是的,return可以回来。

或者你可以throw例外。

在这两种情况下,您都需要注意处理所需的资源解除分配。

答案 1 :(得分:3)

在声明为int function()的函数中,您始终可以返回一些值,例如return 0; -at随时随地在函数体内的任何地方。

您也可以通过投放exception来跳出某个功能,这是非本地control flow转移。

在实践中,你抛出一些例外,例如

 throw std::runtime_error("something bad");

然后call stack中的某些功能仍然有效catch该异常。所以也许你的main包含

 try {
    do_the_job(something);
 } 
 catch (std::runtime_error err) {
    std::cerr << "bad thing happened:" << err.what() << std::endl;
    exit(EXIT_FAILURE);
 }

和名为do_the_job的{​​{1}}调用了foo,其中bar调用了function throw main中发现的异常等。 ..(调用堆栈上的本地值的析构函数被调用)。

答案 2 :(得分:3)

您需要提供返回值,或throw例外。如果控制流正常返回调用者,那么只需return 0;。但这表明存在组织问题。

只有返回return的函数才允许

void没有值。

答案 3 :(得分:3)

如果您的函数的返回类型为int,那么如果您返回,则需要返回一个值,而不仅仅是return;

函数的返回值可能对调用者有一定意义。因此,以下三种情况之一适用:

1)有一些可用的整数值并不意味着“我做了些什么”。因此,您可以记录该值意味着“我没有做任何事情”,并将其返回。 0-1通常是最有可能用于此的值,但它完全取决于函数的作用以及返回值的含义。

2)没有可用的值并不意味着“我做了什么”,所以函数不能返回一个值来说“我什么也没做”。然后你可以改变函数的签名,给它一个指示它是否做任何事情的方法 - 比如返回一个pair<bool,int>而不是一个int,一个值表示成功/失败,另一个对成功而不是失败有意义。或者,您可以将int &参数添加到function,在其中存储当前用作返回值的值,并将返回类型更改为bool,这只表示成功或失败。或者,如果所讨论的情况是函数无法执行其设计的操作,那么您可以抛出异常(并记录函数可能抛出的内容)。

在上述两种情况下,可能必须更新调用该函数的现有代码(如果更改签名,肯定会更新)。这导致了第三种情况:

3)没有办法让函数指示它什么都不做,你不允许改变函数的界面(例如,它可能已经记录下来不会抛出而你不想改变现有呼叫者所依赖的事实。那么我担心你会遇到你不想要的情况。如果某个函数发现它即使通过投掷也无法满足其合同义务,那么您所能做的就是terminateexit。程序无法继续,因为调用者完全有权期望该函数可以执行“某些操作”,但您无法执行此操作。这通常表明设计在某种程度上是错误的,或者您实现的界面不够灵活,不足以支持您的计划。

答案 4 :(得分:3)

在C ++中,有三种方法可以结束函数:

  • return合适的值
  • throw例外
  • std::terminate该计划

由程序员决定如何处理你所处的情况取决于你。一般来说,你会发现自己处于两种情况:

  • 技术错误:损坏的状态,违反先决条件,通常通过致电std::terminatethrow
  • 来处理
  • 功能情况:给定参数,没有结果(例如search可能失败),通常通过调用throw或返回标记值来处理。

所以,既然在你的情况下看起来我们正在谈论一个功能情况,你可能会问自己这种情况是否是调用者的错误(在这种情况下,异常是一个好的候选人)或者如果这是正常情况(例如search没有找到任何东西),在这种情况下,哨兵价值可能是最好的。

对于哨兵值,我看过一些方法:

  • C-ish:返回指针(并使用nullptr作为Sentinel),必要时可以是智能指针
  • Object-ish:有一个这样的Null对象
  • 布尔愚蠢:通过引用获取“return参数”并返回一个布尔值来指示是否写入了它
  • 功能性:返回boost::optional<Type>(并使用boost::none作为Sentinel)

确实有很多方案可供选择;如果你返回一个副本,我建议使用后者,如果你返回一个预先存在的对象的句柄,我会推荐指针。

答案 5 :(得分:2)

简单地使用return可能会让你遇到麻烦,因为编译器要求你实际返回一个值,并且任何人在阅读你的原型时都会期望这样。对于您的案例,最好的方法是throw例外。

编辑:我在下面提醒过,是的,只有在出现无法恢复的错误时才会抛出异常。也许一个简单的return是最快的方法。但是,您应该采取的正确行为是在满足条件时提出某种错误标志。