Asegurándose de que las excepciones siempre sean claras

votos
21

Las excepciones en C ++ no necesitan ser capturadas (no hay errores de tiempo de compilación) por la función de llamada. Depende del criterio del desarrollador capturarlos utilizando try / catch (a diferencia de Java).

¿Hay alguna manera de garantizar que las excepciones lanzadas siempre sean atrapadas usando try / catch por la función de llamada?

Publicado el 04/08/2008 a las 11:01
fuente por usuario
En otros idiomas...                            


7 respuestas

votos
22

No.

Consulte Una mirada pragmática a las especificaciones de excepción por razones de por qué no.

La única forma en que puede "ayudar" con esto es documentar las excepciones que su función puede arrojar, por ejemplo, como un comentario en el archivo de encabezado que lo declara. Esto no se aplica por el compilador ni nada. Use revisiones de código para ese propósito.

Respondida el 04/08/2008 a las 11:10
fuente por usuario

votos
9

No deberías estar usando una excepción aquí. Obviamente, este no es un caso excepcional si necesita estar esperándolo en cualquier lugar donde use esta función.

Una mejor solución sería obtener la función para devolver una instancia de algo como esto. En las compilaciones de depuración (suponiendo que los desarrolladores sigan las rutas de código que acaban de escribir), obtendrán una afirmación si olvidan comprobar si la operación tuvo éxito o no.

class SearchResult
{
  private:
    ResultType result_;
    bool succeeded_;
    bool succeessChecked_;

  public:
    SearchResult(Result& result, bool succeeded)
      : result_(result)
      , succeeded_(succeeded)
      , successChecked_(false)
    {
    }

    ~SearchResult()
    {
      ASSERT(successChecked_);
    }

    ResultType& Result() { return result_; }
    bool Succeeded() { successChecked_ = true; return succeeded_; }
}
Respondida el 24/09/2008 a las 10:24
fuente por usuario

votos
4

Fuera del alcance de su pregunta, por lo que debatí no publicar esto, pero en Java hay actualmente 2 tipos de excepciones, marcadas y sin marcar. La diferencia básica es que, al igual que en c[++], no tienes que atrapar una excepción sin marcar.

Para una buena referencia intente esto

Respondida el 04/08/2008 a las 18:51
fuente por usuario

votos
2

Chris 'probablemente tenga la mejor respuesta pura a la pregunta:

Sin embargo, tengo curiosidad sobre la raíz de la pregunta. Si el usuario siempre debe envolver la llamada en un bloque try / catch, ¿debería la función llamada por el usuario arrojar excepciones en primer lugar?

Esta es una pregunta difícil de responder sin más contexto con respecto a la base de código en cuestión. Disparar desde la cadera, creo que la mejor respuesta aquí es envolver la función de aceleración tal que la (si no la única, dependiendo del estilo general excepción del código) interfaz pública recomendada hace el try / catch para el usuario. Si solo está tratando de asegurarse de que no haya excepciones no controladas en su código, las pruebas unitarias y la revisión del código probablemente sean la mejor solución.

Respondida el 05/08/2008 a las 05:56
fuente por usuario

votos
0

Había una vez un intento de añadir especificaciones de excepción dinámicos a la firma de una función, pero dado que el lenguaje no podría cumplir su exactitud, no se deprecia más adelante.

En C ++ 11 y hacia adelante, ahora tenemos el especificador noexcept .
Una vez más, si la firma está marcado para lanzar, todavía no hay requriement que ser manejado por la persona que llama.


Dependiendo del contexto, puede asegurarse de que el comportamiento excepcional ser manejado mediante la codificación en el sistema de tipos.

Ver: std :: opcional como parte de los fundamentos de la biblioteca.

Respondida el 08/05/2016 a las 12:07
fuente por usuario

votos
0

¿Hay alguna manera de garantizar que las excepciones lanzadas siempre sean atrapadas usando try / catch por la función de llamada?

Me parece bastante gracioso que la multitud de Java, incluido yo mismo , intente evitar excepciones comprobadas. Intentan forzar su camino para verse obligados a atrapar excepciones mediante el uso de RuntimeExceptions .

Respondida el 04/08/2008 a las 19:14
fuente por usuario

votos
0

O podrías comenzar a lanzar excepciones críticas. Sin duda, una excepción de acceso violación será captar la atención de sus usuarios.

Respondida el 04/08/2008 a las 18:33
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more