2011-04-05 11 views
62

Siempre me he preguntado que, dado que Qt usa casi todas las características de C++ en el estándar y de una forma maravillosa e innovadora, y siempre que no utilice una característica en particular, tiene una razón válida y aplicable para no hacerlo. En ese caso, ¿por qué ninguna clase Qt usa la palabra clave throw y throw alguna excepción? ¿Cuál es su razón de ser que nunca requiere un bloque try...catch en nuestro código escrito Qt?¿Por qué Qt no utiliza el manejo de excepciones?

Personalmente, yo mismo no me gusta mucho y nunca lo uso si estoy trabajando con Qt y siempre voy con códigos de error y valores de retorno en lugar de arrojar objetos de excepción. Pero, ¿por qué no veo una clase QException en su documentación? ¿Cuál es el punto de vista de los desarrolladores de Qt sobre esto?

+2

En una nota nueva puede lanzar std :: bad_alloc en la mayoría de las situaciones, no se sienta demasiado cómodo si quiere escribir un código resistente. – odinthenerd

Respuesta

61

Por razones históricas, principalmente. El soporte de excepción en compiladores tomó bastante tiempo para madurar. Citando de Nokia Tobias Hunger:

"Cuando Qt se inició excepciones no estaban disponibles para todos los compiladores que debía estar respaldada por Qt Hoy estamos tratando de mantener el API consistente, por lo que los módulos que tienen un historial de no usar. las excepciones generalmente no recibirán código nuevo con excepciones añadidas. Notará que se usan excepciones en algunos de los nuevos módulos de Qt. "

Creo que eso lo resume todo.

+3

Supongo que es hora de adaptarse a los nuevos tiempos. Las razones históricas no pueden evitar que utilicemos una característica tan agradable. –

+3

Una más [razón] (http://doc.qt.io/qt-5.5/exceptionsafety.html) de Qt official [documentation] (http://doc.qt.io/): * Qt en sí mismo no arrojará excepciones En cambio, se usan códigos de error.Además, algunas clases tienen mensajes de error visibles para el usuario, por ejemplo [QIODevice :: errorString] (http://doc.qt.io/qt-5/qiodevice.html#errorString)() o [QSqlQuery :: lastError] (http://doc.qt.io/qt-5/qsqlquery.html#lastError)(). 'Esto tiene razones históricas y prácticas: activar excepciones puede aumentar el tamaño de la biblioteca en más del 20% .' * –

11

Si busca excepciones "qt" en google obtendrá muchas discusiones sobre este tema. Here es una respuesta "oficial":

Cuando Qt se inició excepciones no estaban disponibles para todos los compiladores que necesitaban ser apoyado por Qt. Hoy intentamos mantener las API consistentes, por lo que los módulos que tienen un historial de no usar excepciones generalmente no obtendrán código nuevo con excepciones añadidas.

Notará que se utilizan excepciones en algunos de los nuevos módulos de Qt.

Si busca una excepción en el índice del asistente (es decir, en la documentación de Qt) encontrará algunas clases de excepciones, p. QtConcurrent :: Exception.

6

Puede leer un debate agradable, mayormente civilizado sobre las excepciones here on the KDE devel mailinglist. Como KDE y QT están relacionados, supongo que se aplican los mismos problemas, que (si leo el hilo correctamente) pueden resumirse como:

  • Las excepciones tienen problemas de rendimiento según el compilador.
  • Blindaje usuarios de la biblioteca de la obligación de utilizar las excepciones (por no tirarlas a la de la biblioteca)
  • cuestiones en torno a la especificación de excepciones en C++
+2

¿Qué problemas de rendimiento? Bjarne parece escribir que en su nuevo libro, es casi no-operativo si no se producen, y si lo hacen, ¿es máximo una sobrecarga de llamada de función? Además, ¿qué problemas hay en la especificación? No entendí la parte de protección. ¿Puedes elaborar? – lpapp

+0

Hola @LaszloPapp, mis puntos en su mayoría quedan claros si lees el hilo que enlazo. De lo contrario, creo que las dos respuestas mejor calificadas podrían ser más directas que las mías. –

+1

@Ipapp: Bjarne no conoce todos los problemas de implementación ... MinGW (el puerto de Windows de GCC) tuvo una gran caída de rendimiento (25%) con excepciones habilitadas (incluso sin usarlas en el código) hace un par de años. Ahora está resuelto, pero claramente las excepciones han sido un problema por algún tiempo, incluso si los compiladores convencionales (gcc bajo linux, msvc ...) no tuvieran problemas. – galinette

Cuestiones relacionadas