Equivalente de IllegalArgumentException de Java, en C ++
-
22-08-2019 - |
Pregunta
En Java, si un argumento de entrada a un método no es válido, podemos echar un IllegalArgumentException
(que es de tipo RuntimeException
). En C ++, no hay noción de excepciones estén activados o desactivados. ¿Hay una excepción similar en C ++ estándar que se puede utilizar para indicar una excepción de tiempo de ejecución? ¿O hay un estilo común no en el estándar, pero todo el mundo sigue en la práctica para una situación como esta?
O, ¿debo crear mi propia excepción personalizada y tirarlo?
Solución
A diferencia de Java, C ++ no tiene un "marco estándar", pero sólo una pequeña (y opcional) biblioteca estándar. Por otra parte, hay diferentes opiniones en virtud de los programadores de C ++ si se utilizará excepciones en absoluto .
Por lo tanto, se encuentran diferentes recomendaciones por diferentes personas: A algunos les gusta utilizar tipos de excepción de la librería estándar, algunas bibliotecas (por ejemplo Poco) utilizan una jerarquía de excepción personalizada (derivado de std :: excepción), y otros no utilizar excepciones en absoluto (por ejemplo, Qt).
Si usted quiere meter a la biblioteca estándar, existe un tipo de excepción especializada:. invalid_argument
(se extiende logic_error
)
#include <stdexcept>
// ...
throw std::invalid_argument("...");
En la referencia: Aquí se presenta una visión general de tipos de excepción estándar definidos (y documentados) en stdexcept
:
exception
logic_error
domain_error
invalid_argument
length_error
out_of_range
runtime_error
range_error
overflow_error
underflow_error
Otros consejos
std :: domain_error puede ser lo que está buscando, pero sospecho que muy pocas personas lo utilizan. La mayoría de la gente obtiene sus propios tipos de excepción de std :: excepción.
Yo siempre uso std::invalid_argument
de argumentos ilegales.
Si no es válida por decir no satisfechos método esperado valores se puede tirar
std::logic_error
or
std::runtime_error.
Si se refiere a algo relacionado con la lanza como un objeto no se puede convertir a otro - no hay excepción para eso y no será lanzado de forma automática.
De hecho lo hará. Pero sólo por dynamic_cast <> en las referencias. Se tirará
std::bad_cast
No estoy seguro de que es una buena idea para lanzar este uno por su cuenta.
Yo prefiero usar logic_error y sus derivados en caso de que alguien pasó parámetro incorrecto, ya que es un error lógico: programador pasado un tipo incorrecto de argumentos.
Sin embargo, más de todo lo que gusta usar aserción en tales casos. Debido a que tales cosas como pasar valores erróneos o tipos a su función puede ser aceptable sólo durante el desarrollo y esos controles deben ser evitados en el comunicado.
Usted puede lanzar una excepción estándar o hágalo usted mismo. Es posible que desee incluir información adicional en la excepción estás tirando, y que sería una buena razón para hacer su propio.
En lo personal, no he visto tal dominio de cotejo en los sistemas de los que he trabajado. Ciertamente, no es universal.