Esta es una P relacionada: ¿Es el uso de la cláusula finalmente para hacer el trabajo después de devolver un mal estilo / peligroso?
En la Q referenciada, el código finalmente está relacionado con la estructura utilizada y la necesidad de buscar previamente. Mi pregunta es un poco diferente, y creo que es pertinente para el público en general. Mi ejemplo particular es una aplicación winform de C #, pero esto también se aplicaría al uso de C ++ / Java.
Noto bastantes bloques try-catch-finally donde hay mucho código no relacionado con excepciones y manejo / limpieza de excepciones enterrado dentro del bloque. Y admitiré mi predisposición a tener bloques try-catch-finally muy ajustados con el código estrechamente relacionado con la excepción y el manejo. Aquí hay algunos ejemplos de lo que estoy viendo.
Los bloques de prueba tendrán muchas llamadas preliminares y variables que se establecerán antes del código que podrían arrojarse. La información de registro también se configurará y ejecutará en el bloque de prueba.
Finalmente, los bloques tendrán llamadas de formateo de formato / módulo / control (a pesar de que la aplicación está a punto de finalizar, como se expresa en el bloque catch), así como la creación de nuevos objetos como paneles.
Aproximadamente:
methodName (...) { tratar { // Mucho código para el método ... // código que podría arrojar ... // Mucho más código para el método y un retorno ... } atrapar (algo) {// manejar excepción} finalmente { // alguna limpieza debido a una excepción, cerrando cosas // más código para las cosas que se crearon (ignorando que podrían haberse producido excepciones) ... // tal vez cree algunos objetos más } }
El código funciona, por lo que tiene algún valor. No está bien encapsulado y la lógica es un poco complicada. Estoy (dolorosamente) familiarizado con los riesgos de cambiar el código, así como la refactorización, por lo que mi pregunta se reduce a querer conocer la experiencia de los demás con un código estructurado de manera similar.
¿El mal estilo justifica hacer los cambios? ¿Alguien ha sido gravemente quemado por una situación similar? ¿Te gustaría compartir los detalles de esa mala experiencia? ¿Dejarlo porque estoy exagerando y no es tan mal estilo? ¿Obtener los beneficios de mantenimiento de ordenar las cosas?
finally
hace en C #). ¿Cuál es el equivalente de C ++? En lo que estoy pensando es en el código después de catch
, y eso aplica lo mismo para el código después de C # finally
.
Environment.FailFast()
; es posible que no se ejecute si tiene una excepción no detectada. Y se vuelve aún más complicado si tiene un bloque iterador con el finally
que itera manualmente.
finally
. Todos los buenos usos están cubiertos por RAII / RRID / SBRM (el acrónimo que desee).