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

Jul*_*ich 6 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. 或者我应该定义自定义异常?

(如果有人想知道:我试图在三斜模拟框中变换坐标,实际上是三个长度和三个角度 - 如果你有兴趣,请看这里.)

R S*_*ahu 7

这些例外的意图:

std::invalid_argument:

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

std::logic_error:

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

没有标准库组件直接抛出此异常,但异常类型std::invalid_argument,std::domain_error,std::length_error,std::out_of_range,std::future_error,和std::experimental::bad_optional_access衍生自std::logic_error.

std::out_of_range:

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

std::domain_error:

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


鉴于此,我将排除使用std::logic_errorstd::out_of_range您的情况.

std::ivalid_argument不太具体std::domain_error.因此,我的建议是使用std::domain_error.