¿Es una mala práctica regresar desde dentro de un intento de captura finalmente bloquear?

StackOverflow https://stackoverflow.com/questions/449099

  •  19-08-2019
  •  | 
  •  

Pregunta

Así que encontré 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 se compila bien y funciona como debería, pero no parece correcto regresar desde un bloque de prueba, especialmente si finalmente hay un asociado.

¿Mi problema principal es qué sucede si finalmente lanza una excepción propia? Tienes una variable devuelta pero también una excepción con la que lidiar ... ¿así que me interesa saber qué piensan los demás acerca de regresar desde un bloque de prueba?

¿Fue útil?

Solución

No, no es una mala práctica. Poner return donde tenga sentido mejora la legibilidad y el mantenimiento y hace que su código sea más fácil de entender. No debería importarle ya que el bloque finalmente se ejecutará si se encuentra una declaración return .

Otros consejos

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

Personalmente, evitaría este tipo de codificación ya que no tengo ganas de ver las declaraciones de retorno antes de las declaraciones finalmente.

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

Por lo tanto, organizaría el código para que la declaración de devolución siempre aparezca después de las declaraciones finalmente.

Esto puede responder a su pregunta

Lo que realmente sucede en un intente {return x; } finalmente {x = nulo; } declaración?

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

Dicho esto, podría ser mejor reestructurar su código de todos modos solo para que no lo confunda más adelante ni a otra persona que no esté al tanto 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 suelen ser más difíciles de leer y analizar. Pero esa objeción tiene más que ver con las declaraciones de retorno que catch y finalmente bloquea.

En su ejemplo, de cualquier manera es equivalente, ni siquiera me sorprendería si el compilador generara el mismo código. Si ocurre una excepción en el bloque finalmente, tiene los mismos problemas si pone la declaración de devolución 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 declaración de retorno, de esta manera es más fácil ver el flujo del método, se deduce que también me gusta poner la declaración de retorno al final para que sea fácil ver que es al final del método y esto es lo que devuelve.

Creo que con el enunciado return tan bien colocado como el último enunciado, es menos probable que otros vengan y rocíen enunciados de retornos múltiples en otras partes del método.

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