我应该抛出异常吗?

Flo*_*ian 6 c++ error-handling exception

我是C#程序员,但现在我想进一步学习C++.
我知道C++的基础知识,但我不知道如何处理错误.

例如:我正在写一个库.我创建了一个构造函数,它请求一个整数作为参数.
如果该整数大于50,则表示错误.在C#中我会抛出ArgumentOutOfRange异常,但是我应该在C++中做什么?

And*_*owl 21

在C#中我会抛出一个ArgumentOutOfRange异常,但我应该在c ++中做什么?

首先,你应该考虑这是否应该是你的功能的前提条件,让责任检查值是否在调用者的范围内.

如果您决定使用此选项,则调用具有超出范围值的函数将是未定义的行为,并且在函数内部您可以使用调试断言来帮助您发现可能的错误 - 无需抛出任何异常.

另一方面,如果您决定该函数应该具有广泛的契约,并且当参数超出允许范围时通过抛出异常以明确定义的方式做出反应,那么您可以抛出std::out_of_range异常.

例如:我正在写一个图书馆[...]

如果您正在编写库,这意味着您不了解客户在性能和稳健性方面的确切要求,您可以考虑提供两个这样的功能 - 一个具有抛出异常的广泛合同,另一个具有狭窄的合同,假设客户提供有意义的输入.

这样,您的库的用户可以根据他们的用例决定是否可以支付每次调用函数时检查输入正确性的开销.

例如,这是C++标准库采用的策略std::vector,它提供了一个非抛出operator[]的基于索引访问集合元素的狭义契约(如果索引不在,则此函数具有未定义的行为) bounds),以及at()执行索引检查的成员函数,如果索引超出范围则抛出异常.

  • 各地好帖子.+1断言(前/后条件),std :: vector示例和选项. (4认同)