2011-09-28 19 views
14

Estoy escribiendo un pequeño programa en C++ 11 y realmente uso excepciones para una de las primeras.Acerca de detectar buenas prácticas de excepción

Tengo una pregunta sobre cómo detectar las excepciones de manera eficiente, y después de buscar en Google todavía no tengo la respuesta.

¿Cuál es la pregunta más eficaz (o recomendada) entre atrapar la excepción por (const?

En código Esto da:

1)

try { throw std::exception{"what"}; } 
catch (std::exception& ex) {} 

2)

try { throw std::exception{"what"}; } 
catch (const std::exception& ex) {} 

3)

try { throw std::exception{"what"}; } 
catch (std::exception&& ex) {} 

4)

try { throw std::exception{"what"}; } 
catch (const std::exception&& ex) {} 
+1

La captura por referencia de rvalue es ilegal incluso http://stackoverflow.com/q/21977340/5447906 –

Respuesta

31

Debe ponerse por referencia const lvalue (2):

try { throw std::exception{"what"}; } 
catch (const std::exception& ex) {} 

Justificación:

En C++ 11 es posible (mediante el uso de shared_future) que dos hilos podrían estar desenrollando la misma excepción al mismo tiempo. Esto puede ocurrir en su código incluso si no conoce el uso del shared_future, a menos que controle toda la aplicación.

Si se atrapan dos hilos desenrollando la misma excepción simultáneamente, y uno o ambos hilos modifica la excepción, entonces tiene una condición de carrera.

De modo que, siempre que no tenga que modificar el objeto de excepción en la cláusula catch, permita que el compilador aplique esa política por usted: capture por const&. Si realmente necesita modificar la excepción, haga una copia, modifique la copia y lance la copia. Puede hacerlo capturando por valor si está seguro de que esto no cortará su objeto de excepción (que no suele ser el caso si está capturando std::exception).

+0

Gracias por su respuesta, que es realmente útil y clara. – Geoffroy

1

Supongo que la excepción debe tomarse de la manera habitual por lvalue-reference. Here's buena explicación de rvalues ​​referencias utilizar

Cuestiones relacionadas