如何返回以表示C++中的意外输入

How to return to represent an unexpected input in C++

本文关键字:C++ 意外 输入 表示 何返回 返回      更新时间:2023-10-16

假设我有一个函数:

int AndTwoNum(int N, int M, int i)
{
    if ((i < 0) || (i > 31))
    {
        return  //what should I return here?
    }
    int mask = ~0 << i;
    int N_modify = N & mask;
    int M_modify = M & (~mask);
    return N_modify | M_modify;
}

此函数将N的0到i位替换为M的0到i位,并返回值。然而,在这里我们必须检查i是否在[0,31]的范围内。如果不是,我们需要立即停止该功能。然而,对于一个意外的I.,我不知道该返回什么。

一个选项可以是在输入无效的情况下抛出异常,例如

#include <stdexcept>   // For std::invalid_argument
...
int AndTwoNum(int N, int M, int i)
{
    // Check 'i' range.
    if ((i < 0) || (i > 31))
    {
        throw std::invalid_argument("'i' is out of valid range (0-31).");
    }
    ...

如果您想在错误时返回一个整数:对于在错误时要返回的内容,没有硬编码规则。有些函数返回(-1),因为这是表达式,但其他函数返回(0)。重要的是,这个值必须超出可能结果的范围,否则你怎么知道这实际上是一个错误?在您的情况下(-1)听起来是合理的,因为这超出了可能结果的范围。

int AndTwoNum(int N, int M, int i)
{
    if ((i < 0) || (i > 31))
    {
        return  (-1);
    }
    //...

C++中,您也可以抛出异常。

#include <stdexcept>
int AndTwoNum(int N, int M, int i)
{
    if ((i < 0) || (i > 31))
    {
      throw std::invalid_argument("argument out of domain");
    }
    //...

一定要向用户描述bahavior,给出正确的描述。

对于以下情况,我更喜欢使用std::optional

#include <optional>
std::optional<int> AndTwoNum(int N, int M, int i)
{
    if ((i < 0) || (i > 31))
    {
        return  std::optional<int>(); // I got nothing for ya
    }
    int mask = ~0 << i;
    int N_modify = N & mask;
    int M_modify = M & (~mask);
    return std::optional<int>(N_modify | M_modify);
}

然后使用它:

auto n = AndTwoNum(...);
if (n) { // we got a value
    int i = *n; // unpack the value
} else {
    // no value
}

坏消息是,std::optional不是当前(C++11)标准的一部分。据我所知,它将成为C++14的一部分。所以编译器的支持是不稳定的。您也可以使用Boost。在此期间是可选的,这就是std::optional的基础。

另一种选择是返回std::pair<int, bool>,其中bool部分用于指示int是否具有有效值。这基本上就是std::optional所做的,但具有更干净的接口。