我是一名C#程序员,但现在想更深入地学习C++。
我了解C++的基础知识,但不知道如何处理错误。
例如:我正在编写一个库。我创建了一个构造函数,要求一个整数作为参数。
如果该整数大于50,则发生错误。在C#中,我会抛出ArgumentOutOfRange
异常,但在C++中应该怎么做呢?
我是一名C#程序员,但现在想更深入地学习C++。
我了解C++的基础知识,但不知道如何处理错误。
例如:我正在编写一个库。我创建了一个构造函数,要求一个整数作为参数。
如果该整数大于50,则发生错误。在C#中,我会抛出ArgumentOutOfRange
异常,但在C++中应该怎么做呢?
std::out_of_range
异常。std::vector
提供了一个非抛出异常的operator[]
,用于基于索引访问集合中的元素(如果索引越界,则此函数的行为未定义),以及一个成员函数at()
,它执行索引检查并在索引越界时抛出异常。这取决于是否有可能在正常程序流程中传递大于50的整数给构造函数,或者这是一个异常情况。但通常情况下,唯一使对象构建失败的方法是抛出异常。
您的用户代码可能如下所示:
int n = parse_user_input()
if (n < 50)
{
Foo x(n);
x.do_cool_stuff();
}
else
{
// report user error
}
Foo::Foo(int)
抛出异常是完全可以接受的。<stdexcept>
中找到一些有用的标准异常类。来自C++ FAQ: [17.8] 如何处理构造函数失败的情况?
摘录:
抛出异常。
构造函数没有返回类型,因此无法使用返回代码。因此,最好的方法是通过抛出异常来表示构造函数失败。如果您无法使用异常选项,则“最不好”的解决方法是通过设置内部状态位将对象置于“僵尸”状态,以便对象表现得像已经死亡一样,即使它在技术上仍然活着。
因此,在您的情况下,抛出std::invalid_argument
或std::out_of_range
将是完全可以接受的。如果在您的情况下这有益处,您还可以抛出自定义异常。在C++ FAQ中,请参见:[17.12] 我应该抛出什么?