我应该使用异常来检查有效输入吗?

Should I use exceptions for checking valid input?

我正在使用 gcc10.2c++20

python.

2 年后我正在学习 C++

在python中,我们总是运行及时检查输入的有效性

def createRectangle(x, y, width, height): # just for example
    for v in [x, y, width, height]:
        if v < 0:
            raise ValueError("Cant be negative")
    # blahblahblah

我如何在 C++ 中执行这样的过程?

for (int v : {x, y, width, height})
    if (v < 0)
        throw std::runtime_error("Can't be negative");

请注意,这样的循环将每个变量复制两次。如果您的变量很难复制(例如容器),请改用指针:

for (const int *v : {&x, &y, &width, &height})
    if (*v < 0)
        ...

评论还建议使用引用,例如for (const int &v : {x, y, width, height}),但每个变量仍会为您提供一份副本。所以如果一个类型那么重,我更喜欢指针。

在 C++ 中:

  1. 使用适当的类型,这样验证(此时您 使用 变量而不是从某些输入设置它们)是不必要的,例如unsigned 的长度。 C++ 的类型比 Python 更强,因此您不需要大量的验证检查来确保将正确的类型传递给函数。

  2. A throw 大致等同于 Python 中的 raise。在 C++ 中,我们倾向于从 std::exception 派生异常并抛出它。

Boost (www.boost.org) 有一个很好的验证库,值得一看。