c++ - utilizar - Asegurándose de que las excepciones siempre sean claras




tag questions para que sirve (5)

¿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 .

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 usando 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?


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


No.

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

La única manera 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 cabecera que lo declara. Esto no se aplica por el compilador ni nada. Use revisiones de código para ese propósito.


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_; }
}

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. Disparando desde la cadera, creo que la mejor respuesta aquí es ajustar la función de modo que la interfaz pública recomendada (si no solo, dependiendo del estilo de excepción general del código) la intente / atrape 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.





try-catch