Recientemente vi que la biblioteca impulsar program_options lanza un logic_error
si la entrada de la línea de comandos no se pudo analizar. Eso desafió mis suposiciones sobre logic_error
contra runtime_error
.Confundido sobre std :: runtime_error contra std :: logic_error
Supuse que los errores lógicos (logic_error
y sus clases derivadas) eran problemas que resultaban de fallas internas para adherirse a las invariantes del programa, a menudo en forma de argumentos ilegales para las API internas. En ese sentido, son en gran parte equivalentes a ASSERT, pero destinados a ser utilizados en código liberado (a diferencia de ASSERT, que generalmente no se compilan en código publicado). Son útiles en situaciones donde no es factible integrar componentes de software separados en compilaciones de depuración/prueba o las consecuencias de una falla son tales que es importante dar retroalimentación en tiempo de ejecución sobre la condición invariable no válida para el usuario.
mismo modo, pensé que runtime_error
s dieron como resultado exclusivamente de las condiciones de tiempo de ejecución fuera del control del programador: errores de E/S, la entrada de usuario no válido, etc.
Sin embargo, program_options es, obviamente, muy usado (principalmente?) como un medio para analizar la entrada del usuario final, entonces bajo mi modelo mental ciertamente debería arrojar un runtime_error
en el caso de una mala entrada.
¿Dónde me estoy equivocando? ¿Estás de acuerdo con el modelo de impulso del tipeo de excepciones?
¿Por qué no hace esta pregunta en la lista de correo de los usuarios de impulso? –