2009-03-13 13 views
10

en C++, <stdexcept> tiene una clase base para 'errores de dominio', std :: domain_error. No entiendo en qué circunstancias debería arrojar un error de dominio en mi código. todas las otras clases base de excepciones son bastante auto explicativas. Estoy bastante seguro de que std :: domain_error no tiene nada que ver con los nombres de dominio de Internet, per se, así que explique qué clase de error es un error de dominio y proporcione algunos ejemplos.¿Qué es un error de dominio

+0

, por lo que veo muchas respuestas sobre los dominios matemáticos, p. sqrt (-1) debería lanzar un domain_error (a menos que, por supuesto, implemente números complejos). ¿Cómo es esto diferente de range_error? antes de sus respuestas, habría considerado que sqrt (-1) es un range_error. – rev

+0

Debe tenerse en cuenta que ninguna función de biblioteca estándar de C++ arroja un error de dominio. Está destinado para el usuario final. – Dan

Respuesta

11

Los errores de dominio y de rango se usan cuando se trata de funciones matemáticas.

Por un lado, el dominio de una función es el conjunto de valores que puede aceptar la función.Por ejemplo, el dominio de la función de raíz cuadrada es el conjunto de números reales positivos. Por lo tanto, se lanzará una excepción domain_error cuando los argumentos de una función no están contenidos en su dominio

Por otro lado, el rango de una función es el conjunto de valores que la función puede devolver. Por ejemplo, el rango de una función como esta:

f(x) = -x² 

es el conjunto de números reales negativos. Entonces, ¿qué sentido tiene el range_error? Si los argumentos de la función están en su dominio, entonces el resultado debe estar en su rango, por lo que no debería haber ningún error en el rango ... Sin embargo, a veces el valor puede ser definido, pero sin ser representable. Por ejemplo, en C, las funciones en <math.h> generan errores si el valor de retorno es demasiado grande (o demasiado pequeño) para representar

+0

Me pregunto si es estándar o reprensible arrojar domain_error y range_error en funciones no matemáticas, para representar las mismas condiciones de error (argument_error rather than domain_error quizás?) – fuzzyTew

+1

@fuzzyTew: De hecho, la biblioteca estándar contiene una clase ['invalid_argument'] (http://msdn.microsoft.com/en-us/library/xcs4t8fy%28v=vs.80%29.aspx), por lo que probablemente debería usar eso en su lugar :)! –

+0

Gracias por una buena explicación de cuándo usar la excepción. Tu opinión sobre range_error también es interesante. Como [cpplus.com] (http://www.cplusplus.com/reference/stdexcept/range_error/) indica que es para "errores de rango en los cálculos internos". Incluso se coloca en el grupo de errores de tiempo de ejecución ... – Arks

6

A error de dominio se refiere a problemas con dominios matemáticos de funciones. Las funciones a veces se definen solo para ciertos valores. Si intenta invocar dicha función con un argumento que no forma parte de su dominio, se trata de un error de dominio.

Por ejemplo, intentar invocar sqrt() con un argumento negativo es un error de dominio, ya que los números negativos no son parte del dominio de sqrt().

+0

Pero cuando hago sqrt (-1) devuelve nan y no lanza una excepción. – rmp251

1

Se refiere a los dominios matemáticos.

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

    //... 
} 
2

Es por errores lógicos de la clase de errores de "dominio". Esto podría aplicarse a cualquier situación donde la entrada a una función exceda el dominio permitido para que funcione. Ese es su propósito declarado en el estándar.

Por ejemplo, tiene una función que solo toma flotantes positivos, por lo que arroja un domain_error para números negativos.

+0

¿cómo es eso diferente de range_error? – rev

2

bastante buena forma explicación cplusplus.com:

Generalmente, el dominio de una función matemática es el subconjunto de valores que se define para. Por ejemplo, la función raíz cuadrada solo está definida para números no negativos. Por lo tanto, un número negativo para dicha función sería un error de dominio.

1

"Descripción detallada lanzada por la biblioteca, o por usted, para informar de errores de dominio (dominio en el sentido mathmatical)."

Desde: http://www.aoc.nrao.edu/~tjuerges/ALMA/STL/html/classstd_1_1domain__error.html

acuerdo con esto, debería ser utilizado si recibe una entrada que no cumple con las restricciones que pone en su interfaz. Como decir, una función que se supone que recibe un valor positivo y recibe una negativa.

2

Bueno, esta es toda la orientación que recibe de la norma C++:

El domain_error clase define el tipo de objetos lanzados como excepciones por la aplicación reportar el dominio errores .

El dominio aquí significa "dominio del problema", no tiene nada que ver con Internet. Por ejemplo, una función de raíz cuadrada podría arrojar un error de dominio si se pasa un número negativo.

Cuestiones relacionadas