2010-06-28 8 views
17

Wikipedia dice que "Se dice que un fragmento de código es excepcional, si las fallas de tiempo de ejecución dentro del código no producen efectos negativos, como pérdidas de memoria, datos almacenados ilegibles o resultados no válidos. El código de excepción segura debe satisfacer invariantes colocados en el código incluso si ocurren excepciones ".Excepción de seguridad en Qt

Y parece que necesitamos el manejo de excepciones para la seguridad de excepciones. Por otro lado, el manejo de excepciones no es muy popular en las aplicaciones de Qt, siempre que lo vea.

¿Cuáles son sus mejores prácticas en Qt para cumplir con la excepción de seguridad? ¿Qué usas en lugar del manejo de excepciones?

+1

QT es una biblioteca muy antigua y muy pobre en lo que respecta a la seguridad de excepciones. Considere cómo se deben asignar todos los widgets pero no hay un puntero inteligente para RAII. Lo mejor que puede hacer es asignarlos a un auto_ptr y liberar la memoria a la matriz/diseño al insertar.Tienen algunas disposiciones básicas como QMutexLocker, ya que tirar mientras está bloqueado un mutex sería desastroso, pero hay mucho más que necesitan proporcionar o mucho trabajo que tendrás que hacer tú mismo para usar qt de una manera segura. . – stinky472

+8

@ stinky472: Incorrecto. [QSharedPointer] (http://doc.trolltech.com/4.6/qsharedpointer.html) – MSalters

+0

@ stinky472: ¿Qué toolkits de la GUI permiten asignar los widgets? ¿Y por qué querrías hacer esto? Suena como un argumento de "hombre de paja". – kevinarpe

Respuesta

10

C++ tiene un mecanismo muy potente para excpetion-seguridad. Los descriptores se ejecutan para todas las variables que salen del alcance debido a una excepción. Esto difiere de los lenguajes como Java, donde la excepción de seguridad requiere que el programador obtenga las cláusulas catch y finally correctas.

El comportamiento C++ de los destructores de llamada funciona a la perfección con los objetos Qt en la pila. Todas las clases de Qt tienen destructores y ninguna requiere limpieza manual. Además, QSharedPointer<T> se puede usar para administrar objetos Qt asignados en el montón; cuando el último puntero sale del alcance, el objeto se destruye. Esto incluye el caso en que el puntero sale del alcance debido a una excepción.

Por lo tanto, la seguridad de excepción está ciertamente presente en Qt. Es solo transparente.

+2

Creo que el problema con QSharedPointer es que no se usa en muchos lugares. Por ejemplo, un QLayout espera QWidget * con la expectativa de que QLayout se convierta en el administrador de memoria para él. No podemos usar QSharedPointer aquí porque se supone que QLayout borrará el widget cuando se elimine del diseño. :-( – stinky472

+3

La publicación original del autor afirmaba que "el manejo de excepciones no es muy popular en las aplicaciones de Qt siempre que lo vea", lo cual es cierto. La existencia de QSharedPointer no cambia nada porque pocas partes de la API de QT y sus ejemplos realmente lo usan En cambio, tenemos ejemplos como QButton * button = new QButton (...); QVBoxLayout * layout = new QVBoxLayout (...); La biblioteca, en su mayor parte, no está codificada para ser excepcionalmente segura. Es algo que debe abordarse y hacer que más partes de la biblioteca acepten y almacenen QSharedPointer sería una muy buena solución. – stinky472

2

Mi mejor práctica es no usar (o al menos evitarlos tanto como sea posible) las excepciones de C++ en el código basado en Qt, que hace que su manejo no sea un problema. Sin embargo, Qt no es realmente la razón de esto, simplemente creo que las excepciones a menudo hacen que las cosas sean innecesariamente más complicadas de lo que deberían ser. Pero ayuda Qt en sí mismo es sobre todo problemas de excepción libre ... :)

7

Qt es (en su mayoría) no es seguro excepción: http://doc.qt.io/archives/4.6/exceptionsafety.html

Por otra parte se trata de excepciones correctamente en la programación orientada a eventos se muy duro , así que lo mejor es es evitarlos cuando se usan los códigos de error Qt y Pass.

+10

¿Por qué lidiar con las excepciones correctamente en la programación basada en eventos es muy difícil? – metdos

1

Las clases de Qt son exception neutral como se indica en el documentation.

Debería quedarse con los valores booleanos para manejar las condiciones de error, al igual que Qt.

La no utilización de excepciones internamente se realizó por razones de portabilidad, porque Qt tiene que admitir muchas plataformas diferentes (la portabilidad y las excepciones no se combinan tan bien).

Una vez más, a partir de los documentos:

Actualmente, el caso de uso sólo está soportado para recuperarse de excepciones lanzadas dentro de Qt (por ejemplo debido a fuera de la memoria) es para salir del bucle de eventos y hacer algo de limpieza antes saliendo de la aplicación. caso de uso típico:

QApplication app(argc, argv); 
... 
try { 
    app.exec(); 
} catch (const std::bad_alloc &) { 
    // clean up here, e.g. save the session 
    // and close all config files. 

    return 0; // exit the application 
} 
+4

Tenga en cuenta que Qt tiene un historial que se remonta a la época en que las excepciones eran nuevas. La portabilidad en el siglo XXI es mucho más fácil. – MSalters

+0

Tienes razón, debería haber hecho hincapié en eso. Aunque realmente no sé mucho sobre excepciones y Symbian, especialmente con las versiones más nuevas. Sé que las versiones anteriores usaban un mecanismo de manejo de excepciones sustancialmente diferente. –

+0

Symbian es un dolor; no es sorprendente dado sus raíces EPOC de los años ochenta. Pero Qt y Symbian no están tan relacionados. Symbian se originó en Psion; Qt en TrollTech. – MSalters

Cuestiones relacionadas