Pregunta

No es necesario detectar las excepciones en C++ (sin errores en tiempo de compilación) mediante la función de llamada.Por lo tanto, depende del criterio del desarrollador detectarlos usando try/catch (a diferencia de Java).

¿Hay alguna manera de garantizar que las excepciones lanzadas siempre se detecten mediante try/catch mediante la función de llamada?

¿Fue útil?

Solución

No.

Ver Una mirada pragmática a las especificaciones de excepción por razones por las que no.

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

Otros consejos

No deberías usar una excepción aquí.¡Obviamente este no es un caso excepcional si necesita esperarlo en todos los lugares donde usa esta función!

Una mejor solución sería hacer que la función devuelva una instancia de algo como esto.En las compilaciones de depuración (suponiendo que los desarrolladores ejerciten las rutas de código que acaban de escribir), obtendrán una afirmación si olvidan verificar 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_; }
}

Fuera del alcance de su pregunta, debatí no publicar esto, pero en Java en realidad hay 2 tipos de excepciones, marcadas y no marcadas.La diferencia básica es que, al igual que en c[++], no es necesario detectar una excepción no marcada.

Para una buena referencia prueba esto

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

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

Esta es una pregunta difícil de responder sin más contexto con respecto al código base en cuestión.Disparando desde la cadera, creo que la mejor respuesta aquí es resumir la función de modo que la interfaz pública recomendada (si no la única, dependiendo del estilo de excepción general del código) haga el intento/captura. para el usuario.Si solo intenta asegurarse de que no haya excepciones no controladas en su código, las pruebas unitarias y la revisión del código son probablemente la mejor solución.

¿Hay alguna forma de asegurarse de que las excepciones lanzadas siempre sean atrapadas utilizando la función de prueba de prueba/captura?

Me parece bastante gracioso que la gente de Java... Incluyéndome a mi - está intentando evitar excepciones marcadas.Están tratando de evitar verse obligados a detectar excepciones mediante el uso Excepciones de tiempo de ejecución.

Una vez hubo un intento de agregar especificaciones de excepción dinámica a la firma de una función, pero como el lenguaje no podía exigir su precisión, luego fueron depreciados.

En C++ 11 y posteriores, ahora tenemos el especificador noexcepto.
Nuevamente, si la firma está marcada para arrojar, todavía no es necesario que sea manejada por la persona que llama.


Dependiendo del contexto, puede asegurarse de que se maneje el comportamiento excepcional codificándolo en el sistema de tipos.

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

O podrías empezar a lanzar excepciones críticas.Seguramente, una excepción de violación de acceso atrapar la atención de tus usuarios.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top