¿Es una mala práctica regresar desde dentro de un bloque try catch finally?

Así que me encontré con un código esta mañana que se veía así:

try { x = SomeThingDangerous(); return x; } catch (Exception ex) { throw new DangerousException(ex); } finally { CleanUpDangerousStuff(); } 

Ahora este código comstack bien y funciona como debería, pero simplemente no se siente bien regresar desde dentro de un bloque de prueba, especialmente si hay un asociado finalmente.

Mi problema principal es ¿qué pasa si finalmente arroja una excepción de sí mismo? Usted tiene una variable devuelta pero también una excepción que tratar … entonces, ¿me interesa saber qué piensan los demás acerca de regresar desde dentro de un bloque de prueba?

No, no es una mala práctica. Poner el return donde tenga sentido mejora la legibilidad y el mantenimiento y hace que su código sea más simple de entender. No debería preocuparse ya que finally se ejecutará el locking si se encuentra una statement de return .

El finalmente se ejecutará sin importar qué, así que no importa.

Personalmente, evitaría este tipo de encoding ya que no tengo ganas de ver declaraciones de devolución antes de las declaraciones finales.

Mi mente es simple y procesa las cosas de forma bastante lineal. Por lo tanto, cuando paso por el código para el funcionamiento en seco, tendré tendencia a pensar que una vez que puedo alcanzar el enunciado de devolución, todo lo que sigue no importa, lo que obviamente es bastante incorrecto en este caso (no es que afecte el enunciado de devolución sino cuáles podrían ser los efectos secundarios).

Por lo tanto, organizaría el código para que la statement de retorno siempre aparezca después de las declaraciones finally.

Esto puede responder su pregunta

Lo que realmente sucede en una prueba {return x; } finalmente {x = null; } statement?

Al leer esa pregunta, parece que puede tener otra estructura de captura de prueba en la statement final si cree que podría arrojar una excepción. El comstackdor calculará cuándo devolver el valor.

Dicho esto, podría ser mejor reestructurar tu código de todos modos para que no te confunda más tarde o para que alguien más no se dé cuenta de esto también.

Funcionalmente no hay diferencia.

Sin embargo, hay una razón para no hacer esto. Los métodos más largos con varios puntos de salida a menudo son más difíciles de leer y analizar. Pero esa objeción tiene más que ver con los enunciados de devolución que con los bloques catch y finally.

En su ejemplo, de cualquier manera es equivalente, ni siquiera me sorprendería si el comstackdor generara el mismo código. Si ocurre una excepción en el bloque finally, tiene los mismos problemas si coloca la statement return en bloque o fuera de ella.

La verdadera pregunta es estilísticamente, cuál es la mejor. Me gusta escribir mis métodos para que solo haya una statement de devolución, de esta manera es más fácil ver el flujo fuera del método, se deduce que también me gusta poner la statement de devolución al final para que sea fácil ver que es el final del método y esto es lo que devuelve.

Creo que con la statement de devolución tan cuidadosamente colocada como la última statement, es menos probable que otros vengan y salpiquen declaraciones de devoluciones múltiples en otras partes del método.