如何返回以表示C++中的意外输入
How to return to represent an unexpected input in C++
假设我有一个函数:
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
所做的,但具有更干净的接口。
相关文章:
- 在C++中对T*类型执行std::move的意外行为
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 处理除以零会导致<csignal>意外行为
- vscode下的Arduino代码出现意外编译错误
- 使用++运算符会导致意外的结果
- 套接字读取后,我在缓冲区中看到意外输入
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 使用vscode调试时,GDB意外退出
- 此测试()中发生了什么意外过程?为什么总是覆盖 ch[0 1 2..]?
- 尝试将字符串/字符转换为整数会产生意外结果
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- C++标头错误 C2238 意外标记";"
- C++中意外的多头值
- vector.size() 在比较中意外工作
- 使用 malloc() 时出现意外大小
- 多线程程序中出现意外的内存泄漏
- 为什么static_cast基础类型的枚举类int8_t获得意外值?
- 字符串比较中的意外输出
- 我的代码中的意外价值以及我如何修复它
- C++ 编译错误:意外的类型名称"字符串":预期的表达式