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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top