什么是域错误?

17
在C++中,<stdexcept> 有一个基类用于“域错误”,即std::domain_error。我不理解在什么情况下应该在我的代码中抛出域错误。所有其他异常基类都很简单明了。我相信std::domain_error与互联网域名本身无关,请解释一下域错误是什么类别的错误并提供一些示例。

我看到很多关于数学域的回复,例如sqrt(-1)应该抛出一个domain_error(除非你实现了复数)。这与range_error有什么不同?在得到你们的答案之前,我认为sqrt(-1)是一个range_error。 - rev
需要注意的是,没有任何C++标准库函数会抛出域错误。这是为最终用户设计的。 - Dan
7个回答

16

处理数学函数时,域错误和值域错误都会被使用。

一方面,函数的定义域是可以被函数接受的值的集合。例如,平方根函数的定义域是正实数集。因此,当函数的参数不在其定义域中时,应抛出domain_error异常。

另一方面,函数的值域是函数可以返回的值的集合。例如,像这个函数的值域:

f(x) = -x²

这是负实数的集合。那么range_error有什么意义呢? 如果函数的参数在其定义域内,则结果必须在其值域内,因此我们不应该出现与范围相关的错误... 但是,有时候值可以被定义,但却无法被表示。例如,在C语言中,<math.h>中的函数如果返回值过大(或过小)而无法表示,则会生成错误。


我想知道在非数学函数中抛出domain_error和range_error来表示相同的错误条件(也许是argument_error而不是domain_error)是否标准或应该避免。 - fuzzyTew
1
事实上,标准库包含一个类invalid_argument,所以你应该使用它 :)! - Luc Touraille
感谢您对何时使用异常进行了良好的解释。您对range_error的看法也很有趣。正如cpplus.com所述,它用于“内部计算中的范围错误”。它甚至被放置在运行时错误组中... - Arks
返回值过大或过小,无法被机器表示,这正是运行时错误。用同样的思路,我也可以看到当函数进行逐步计算时,即使函数域和函数范围都没问题,在中间某个地方仍然可能超出范围而引发此异常。 - Arks

6

域错误指的是函数的数学域存在问题。有时候函数只在某些值上有定义。如果你试图使用不属于其域的参数调用这样的函数,那么就会产生域错误。

例如,尝试使用负参数调用sqrt()就是一个域错误,因为负数不属于sqrt()的域。


1
但是当我执行sqrt(-1)时,它返回nan而不抛出异常。 - rmp251

3

来自cplusplus.com的解释:

通常,数学函数的定义域是它所定义的值的子集。例如,平方根函数仅对非负数有定义。因此,对于这样的函数,负数将是一个定义域错误。


3

好的,这是C++标准提供的所有指导:

类domain_error定义了由实施抛出的对象的类型,以报告域错误。

这里的域指的是“问题域”,与互联网无关。例如,如果传递一个负数给平方根函数,它可能会抛出一个域错误。


2

这是针对“域”错误类别的逻辑错误。这可能适用于任何输入函数超过其允许操作的域的情况。这是标准中明确规定的目的。

例如,您有一个只接受正浮点数的函数,因此它会为负数抛出一个域错误。


2

1

它指的是数学领域。

float MySqrRoot(float x)
{
    // sqrt is not valid for negative numbers.
    if (x < 0) throw new domain_error;

    //...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接