2009-07-07 21 views
5

Java tiene compiler checked exceptions. Cuando hice la transición a C++, me enteré de que no cuenta con excepciones marcadas. Al principio, seguí usando el manejo de excepciones, porque es una gran característica. Sin embargo, después de un tiempo lo abandoné, porque llegué a una situación , cada función podría arrojar una excepción. Como solo un pequeño porcentaje de las funciones que escribo pueden arrojar excepciones (digamos un 25% como máximo), encontré la sobrecarga de hacer un manejo de excepciones para funciones que no pueden arrojar nada inaceptable.¿Cómo trabajar con excepciones sin marcar?

Debido a esto, estoy realmente sorprendido de que haya muchos desarrolladores que prefieren las excepciones sin marcar. Por lo tanto, tengo curiosidad por saber cómo manejan este problema. ¿Cómo se puede evitar la sobrecarga de hacer un manejo de excepción innecesario en caso de que el idioma no admita excepciones marcadas?

Observación: Mi pregunta se aplica igualmente a C++ y C#, y probablemente a todos los demás lenguajes que no cuentan con el control de excepción comprobado por el compilador.

+0

No todas las funciones pueden arrojar. Las funciones declaradas 'noexcept' no pueden lanzarse (y si lo intentan, se llamará a std :: terminate()). – Shirik

Respuesta

11

Cuando comencé a usar C#, también tuve miedo. Entonces descubrí que en realidad, no importa muy a menudo. Rara vez descubro que puedo capturar una excepción y, por lo tanto, algo útil con ella ... casi todas mis excepciones aparecen en algún lugar cerca de la parte superior de la pila, donde se manejan cancelando la solicitud o lo que sea.

Ahora cuando estoy escribiendo Java, encuentro excepciones comprobadas intensamente frustrantes la mayor parte del tiempo. Creo que hay algo de valor en alguna parte, pero introduce tantos problemas como resuelve.

Básicamente, creo que todavía no hemos conseguido que todo el error maneje el lado correcto de las cosas, pero en general prefiero el enfoque C# al enfoque Java.

+1

De acuerdo. Esta es un área en desarrollo que todavía necesito investigar. –

16

Simple. No se maneja la excepción en "todas las funciones que puedan arrojar": en C++, casi todas las funciones pueden hacerlo. En cambio, lo hace en ciertos puntos clave de su aplicación, donde puede producir un diagnóstico sensible, específico de la aplicación y tomar acciones correctivas sensibles, específicas de la aplicación, aunque el uso de la expresión idiomática RAII significa (como señala Avakar en su respuesta) que a menudo hay pocas medidas correctivas que tomar.

+0

Exactamente. Para eso son. ¿Quién (qué código) sabe cómo manejar maneja. – sharptooth

+0

Doble exactamente: también vea http: // stackoverflow.com/questions/434839/where-do-you-like-to-catch-exceptions-and-why/434903 # 434903 – peSHIr

+3

De acuerdo. RAII realiza el 99% del trabajo que un desarrollador debe realizar manualmente en Java. Solo necesita agregar el control de excepciones en el 1% restante de los casos. También tenga en cuenta que el 80% de las estadísticas están compuestas, pero usted consigue mi deriva. –

4

Además de lo que dijo Neil, debe tener en cuenta que no hay necesidad de try/finally (o en el contexto de C++ try/catch/throw), porque object destructors are called incluso si se produce una excepción.

Es muy posible tener código de excepción con muy pocas declaraciones try.

+0

Eso es lo que dijo Neil cuando mencionó RAII. –

+1

También se refiere a mi respuesta, indicando que hizo una edición de su respuesta después de que publiqué la mía. – avakar

3

Para C++ específicamente, los gastos generales prácticamente desaparecen si diseñas bien tus clases y usas RAII.

Martin York ha escrito un maravilloso ejemplo de eso en this answer.

La función puede arrojar una excepción, sí, pero si lo hace, no tendrá que hacer nada especial para limpiar. De modo que solo necesita capturar la excepción en un solo lugar: la función que puede manejarla y recuperarse del error.

Cuestiones relacionadas