标题<stdexcept>
定义了几个标准异常。但是,我在确定何时使用哪个例外时遇到了麻烦。是否有良好的在线指南?我试着通过一个例子说明我的问题:
函数采用(物理)矢量的长度和角度(0和pi之间)来返回新的矢量。如果角度是负的那么
std::invalid_argument
,因为负角度无效?std::logic_error
,因为负角度在这种情况下没有意义吗?std::out_of_range
,因为负角度超出允许的角度范围?std::domain_error
,因为没有在负角度上定义数学函数。(如果有人想知道:我试图在三斜模拟框中变换坐标,实际上是三个长度和三个角度 - 如果你有兴趣,请参见here。)
答案 0 :(得分:7)
这些例外的意图:
定义要作为异常抛出的对象类型。它会报告由于未接受参数值而产生的错误。
定义要作为异常抛出的对象类型。它报告错误是程序中错误逻辑的结果,例如违反逻辑前置条件或类不变量,并且可能是可以预防的。
没有标准库组件直接抛出此异常,但异常类型
std::invalid_argument
,std::domain_error
,std::length_error
,std::out_of_range
,std::future_error
和{{1 } {派生自std::experimental::bad_optional_access
。
定义要作为异常抛出的对象类型。它报告了尝试访问超出定义范围的元素的错误。
定义要作为异常抛出的对象类型。实现可以使用它来报告域错误,即,输入在定义操作的域之外的情况。
鉴于此,我会排除在您的情况下使用std::logic_error
和std::logic_error
。
std::out_of_range
的具体程度低于std::ivalid_argument
。因此,我的建议是使用std::domain_error
。