Al diseñar mi primera biblioteca C ++ 'seria', me pregunto:
¿Es un buen estilo derivar las excepciones std::exceptiony sus descendientes?
Incluso después de leer
- Diseñando clases de excepción
- ¿Cuál es un 'buen número' de excepciones para implementar en mi biblioteca?
Todavía no estoy seguro. Porque, además de la práctica común (pero quizás no buena), supondría, como usuario de la biblioteca, que una función de biblioteca arrojaría std::exceptions solo cuando las funciones de biblioteca estándar fallaran en la implementación de la biblioteca, y no puede hacer nada al respecto. Pero aún así, al escribir el código de la aplicación, para mí es muy conveniente, y también en mi humilde opinión apuesto a tirar un std::runtime_error. Además, mis usuarios también pueden confiar en la interfaz mínima definida, como what()o códigos.
Y, por ejemplo, mi usuario proporciona argumentos defectuosos, ¿qué sería más conveniente que lanzar un std::invalid_argument, no? Entonces, combinado con el uso común de std :: excepción que veo en el código de otros: ¿Por qué no ir más allá y derivar de su clase de excepción personalizada (por ejemplo, lib_foo_exception) y también de std::exception.
Pensamientos?
lib_foo_exceptionclase se deriva std::exception, el usuario de la biblioteca capturaría lib_foo_exceptionsimplemente capturando std::exception, además de cuando atrapa solo el de biblioteca. Por lo tanto, también podría preguntar si mi clase de raíz de excepción de biblioteca hereda de std :: exception .
lib_foo_exception?" Con heredar de std::exceptionusted puede hacerlo por catch(std::exception)OR por catch(lib_foo_exception). Sin derivar de std::exception, lo atraparías si y solo si , por catch(lib_foo_exception).
catch(...). Está allí porque el lenguaje permite el caso que está considerando (y las bibliotecas que "se comportan mal"), pero esa no es la mejor práctica moderna.
catchsitios más generales y más generales , y también transacciones más generales que modelan una operación de usuario final. Si lo compara con idiomas que no promueven la idea de la captura generalizada de std::exception&, por ejemplo, a menudo tienen mucho más código con try/catchbloques intermedios relacionados con errores muy específicos, lo que disminuye un poco la generalidad del manejo de excepciones a medida que comienza a ubicarse un énfasis mucho más fuerte en el manejo manual de errores, y también en todos los errores dispares que podrían ocurrir.
std::exceptionno significa que arrojes unstd::exception. Además,std::runtime_errorhereda destd::exceptionen primer lugar, y elwhat()método proviene destd::exception, nostd::runtime_error. Y definitivamente debe crear sus propias clases de excepción en lugar de lanzar excepciones genéricas comostd::runtime_error.