标题<stdexcept>定义了几个标准异常.但是,我在确定何时使用哪个例外时遇到了麻烦.是否有良好的在线指南?我试着通过一个例子说明我的问题:
函数采用(物理)矢量的长度和角度(在0和pi之间)来返回新的矢量.如果角度是负的那就是
std::invalid_argument,因为负角度无效?std::logic_error,在这种情况下,负角度没有意义吗?std::out_of_range,因为负角度超出允许的角度范围?std::domain_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::logic_error和std::out_of_range您的情况.
std::ivalid_argument不太具体std::domain_error.因此,我的建议是使用std::domain_error.