c++ - usar - question tags ejemplos
Asegurándose de que las excepciones siempre sean claras (7)
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?
¿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 .
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.
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 tiene que atrapar una excepción no verificada.
Para una buena referencia intente esto
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_; }
}
Hubo una vez un intento de agregar especificaciones de excepción dinámica a la firma de una función, pero dado que el idioma no podía exigir su precisión, posteriormente se depreciaron.
En C ++ 11 y reenviar, ahora tenemos el especificador noexcept .
De nuevo, si la firma está marcada para arrojar, aún no es necesario que la persona que llama la maneje.
Según el contexto, puede garantizar que se maneje un comportamiento excepcional codificándolo en el sistema de tipos.
Ver: std :: opcional como parte de los fundamentos de la biblioteca.
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.