C ++何时使用哪个(标准)异常?

时间:2016-08-03 02:13:17

标签: c++ exception

标题<stdexcept>定义了几个标准异常。但是,我在确定何时使用哪个例外时遇到了麻烦。是否有良好的在线指南?我试着通过一个例子说明我的问题:

函数采用(物理)矢量的长度和角度(0和pi之间)来返回新的矢量。如果角度是负的那么

  1. A std::invalid_argument,因为负角度无效?
  2. A std::logic_error,因为负角度在这种情况下没有意义吗?
  3. A std::out_of_range,因为负角度超出允许的角度范围?
  4. A std::domain_error,因为没有在负角度上定义数学函数。
  5. 或者我应该定义自定义例外吗?
  6. (如果有人想知道:我试图在三斜模拟框中变换坐标,实际上是三个长度和三个角度 - 如果你有兴趣,请参见here。)

1 个答案:

答案 0 :(得分:7)

这些例外的意图:

std::invalid_argument

  

定义要作为异常抛出的对象类型。它会报告由于未接受参数值而产生的错误。

std::logic_error

  

定义要作为异常抛出的对象类型。它报告错误是程序中错误逻辑的结果,例如违反逻辑前置条件或类不变量,并且可能是可以预防的。

     

没有标准库组件直接抛出此异常,但异常类型std::invalid_argumentstd::domain_errorstd::length_errorstd::out_of_rangestd::future_error和{{1 } {派生自std::experimental::bad_optional_access

std::out_of_range

  

定义要作为异常抛出的对象类型。它报告了尝试访问超出定义范围的元素的错误。

std::domain_error

  

定义要作为异常抛出的对象类型。实现可以使用它来报告域错误,即,输入在定义操作的域之外的情况。

鉴于此,我会排除在您的情况下使用std::logic_errorstd::logic_error

std::out_of_range的具体程度低于std::ivalid_argument。因此,我的建议是使用std::domain_error