2009-03-25 17 views
21

En Java si un argumento de entrada a un método no es válido, podemos lanzar un IllegalArgumentException (que es del tipo RuntimeException). En C++, no hay ninguna noción de excepciones marcadas y sin marcar. ¿Existe una excepción similar en C++ estándar que se puede 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?Equivalente de IllegalArgumentException de Java en C++

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

Respuesta

39

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

Por lo tanto, encontrará diferentes recomendaciones 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 excepción personalizada (derivada de std :: exception) y otras no use excepciones en absoluto (por ejemplo, Qt).

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

#include <stdexcept> 

// ... 
throw std::invalid_argument("..."); 

Para la referencia: Aquí se presenta una visión general de los tipos de excepciones 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 
2

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

1

Si no es válida por no decir 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 constituye una excepción para ese y no se lanzará automáticamente.

De hecho lo hará. Pero solo para dynamic_cast <> en las referencias. Se lanzará

std::bad_cast 

No estoy seguro de que es una buena idea para lanzar este uno por su cuenta.

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

Pero más de todo lo que me gusta usar afirmar en tales casos. Debido a que elementos tales como pasar valores o tipos incorrectos a su función pueden ser aceptables solo durante el desarrollo y tales controles deben evitarse en el lanzamiento.

+0

¿Dynamic_cast <>() con un tipo de referencia lanza una excepción estándar? –

+0

Lo hace, una excepción std :: bad_cast. Si es con referencias. Con los punteros se devuelve un 0 y el código de usuario debe verificar el valor del resultado. –

+0

Sí, std :: bad_cast. –

2

Siempre utilizo std::invalid_argument para argumentos ilegales.

1

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 que está lanzando, y esa sería una buena razón para hacerlo usted mismo.

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