我应该使用异常来检查有效输入吗?
Should I use exceptions for checking valid input?
我正在使用 gcc10.2
、c++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++ 中:
使用适当的类型,这样验证(此时您 使用 变量而不是从某些输入设置它们)是不必要的,例如unsigned
的长度。 C++ 的类型比 Python 更强,因此您不需要大量的验证检查来确保将正确的类型传递给函数。
A throw
大致等同于 Python 中的 raise
。在 C++ 中,我们倾向于从 std::exception
派生异常并抛出它。
Boost (www.boost.org) 有一个很好的验证库,值得一看。
我正在使用 gcc10.2
、c++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++ 中:
使用适当的类型,这样验证(此时您 使用 变量而不是从某些输入设置它们)是不必要的,例如
unsigned
的长度。 C++ 的类型比 Python 更强,因此您不需要大量的验证检查来确保将正确的类型传递给函数。A
throw
大致等同于 Python 中的raise
。在 C++ 中,我们倾向于从std::exception
派生异常并抛出它。
Boost (www.boost.org) 有一个很好的验证库,值得一看。