2009-03-27 20 views

Respuesta

25

Sí, es una buena práctica de inheritstd::runtime_error o la other standard exception classes como std::logic_error, std::invalid_argument y así sucesivamente, dependiendo de qué tipo de excepción que es.

Si todas las excepciones heredan algo de std::exception, es fácil detectar todos los errores comunes con catch(const std::exception &e) {...}. Si tiene varias jerarquías independientes, esto se vuelve más complicado. Derivarse de las clases de excepciones especializadas hace que estas excepciones lleven más información, pero qué tan útil es realmente depende de cómo se maneje su excepción.

+6

Captura por const ref: catch (std :: excepción const & e) –

+0

sí, eso es mejor, cambió ... – sth

1

En mi opinión, no importa si heredas de std :: exception o no. Para mí, lo más importante acerca de la definición de excepciones es:

  1. Tener los nombres de las clases de excepción útiles y claras.
  2. Documentando claramente (escribiendo comentarios) cuando se arrojará una excepción por una función o método de clase. Este es el único punto de falla más grande en el manejo de excepciones en mi opinión.
1

No hace una gran diferencia, ya que std::runtime_error también hereda de std::exception. Podría argumentar que el error de tiempo de ejecución transmite más información sobre la excepción, pero en la práctica, las personas a menudo derivan de la clase de excepción básica.

6

No soy un desarrollador de C++, pero una cosa que hicimos en nuestro código C# fue crear una excepción de clase base de nuestro marco, y luego ingrese la excepción lanzada en el constructor:

public FrameworkException(string message, Exception innerException) 
     : base(message, innerException) 
    { 
     log.Error(message, innerException); 
    } 

    ... 

Cualquier deriva la excepción solo tiene que invocar su constructor de base y obtenemos un registro de excepciones consistente en todo. No es gran cosa, pero útil.

+0

Sin embargo, debe tener cuidado con las excepciones, especialmente cuando la construcción de la excepción en sí misma puede arrojar excepciones. – Herbert

3

Es bueno cuando se coloca una excepción en algún ámbito. Por ejemplo, la clase Manipulation puede declarar dentro de las clases de excepción Error.

y capturarlos como

catch (const Manipulation::InputError& error) 
catch (const Manipulation::CalculationError& error) 

En tales casos pueden ser sólo clases vacías sin ningún tipo de información de error adicional a menos que el diseño permite que esas excepciones volar mucho más alto, donde se captura todas las excepciones estándar.

Cuestiones relacionadas