Al diseñar mi primera biblioteca C ++ 'seria', me pregunto:
¿Es un buen estilo derivar las excepciones std::exception
y 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::exception
s 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_exception
clase se deriva std::exception
, el usuario de la biblioteca capturaría lib_foo_exception
simplemente 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::exception
usted 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.
catch
sitios 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/catch
bloques 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::exception
no significa que arrojes unstd::exception
. Además,std::runtime_error
hereda destd::exception
en 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
.