java c++ validation runtimeexception illegal-input

like java



Equivalente de IllegalArgumentException de Java en C++ (5)

A diferencia de Java, C ++ no tiene un "marco estándar" sino una biblioteca estándar pequeña (y opcional). Además, hay diferentes opiniones en los programadores de C ++ sobre si usar excepciones en absoluto .

Por lo tanto, encontrará diferentes recomendaciones por parte de diferentes personas: a algunos les gusta usar tipos de excepción de la biblioteca estándar, algunas bibliotecas (por ejemplo, Poco) usan una jerarquía de excepciones personalizada (derivada de std :: exception), y otras no usan excepciones en absoluto (por ejemplo, Qt).

Si desea mantener la biblioteca estándar, existe un tipo de excepción especializada: invalid_argument ( invalid_argument ).

#include <stdexcept> // ... throw std::invalid_argument("...");

Para la referencia: Aquí hay una descripción general de los 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

En Java, si un argumento de entrada a un método no es válido, podemos lanzar una IllegalArgumentException (que es de tipo RuntimeException ). En C ++, no hay noción de excepciones marcadas y no marcadas. ¿Existe una excepción similar en C ++ estándar que se pueda usar para indicar una excepción de tiempo de ejecución? ¿O hay un estilo común que no está en el estándar pero todos siguen en la práctica para una situación como esta?

O, ¿debería simplemente crear mi propia excepción personalizada y lanzarla?


Puedes lanzar una excepción estándar o tirar la tuya. Es posible que desee incluir información adicional en la excepción que está lanzando, y esa sería una buena razón para hacer la suya propia.

Personalmente, no he visto tal comprobación de dominio en los sistemas en los que he trabajado. Ciertamente no es universal.


Si por inválido quiere decir no cumple los valores esperados del método puede lanzar

std::logic_error or std::runtime_error.

Si te refieres a que algo relacionado con los lanzamientos como un objeto no se puede convertir a otro, no hay excepción para eso y no se lanzará automáticamente.

De hecho lo hará. Pero solo para dynamic_cast <> en referencias. Tirará

std::bad_cast

No estoy seguro de que sea una buena idea lanzar esta por tu cuenta.

Prefiero usar logic_error y sus derivados en caso de que alguien haya pasado un parámetro incorrecto porque es un error lógico: el programador pasó un tipo de argumento incorrecto.

Pero más de todo me gusta usar afirmar en tales casos. Debido a que cosas como pasar valores o tipos erróneos a su función pueden ser aceptables solo durante el desarrollo y tales comprobaciones deben evitarse en la versión.


Siempre uso std::invalid_argument para argumentos ilegales.


std :: domain_error puede ser lo que está buscando, pero sospecho que muy pocas personas lo usan. La mayoría de las personas obtienen sus propios tipos de excepción de std :: exception.