Es una mala práctica para volver dentro de un try catch, finalmente, el bloque?

Así que me llegó a través de algún código de 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 fina y funciona como debería, pero simplemente no se siente derecho a devolver dentro de un bloque try, especialmente si hay un asociado finalmente.

Mi principal problema es lo que ocurre si finalmente se produce una excepción de la que es propia? Tienes una devuelto variable, pero también una excepción a lidiar con… lo que me interesa saber qué piensan los demás sobre el regreso desde dentro de un bloque try?

  • Uno de los beneficios de este estilo es que usted no tiene que declarar x fuera de la try bloque. Usted puede mantener su declaración de cierre para su uso.
InformationsquelleAutor lomaxx | 2009-01-16

6 Kommentare

  1. 162

    No, no es una mala práctica. Poner return donde tiene sentido mejora la legibilidad y mantenibilidad y hace el código más fácil de entender. No importa como finally bloque se ejecuta si un return declaración de que se encuentra.

  2. 17

    La que finalmente será ejecutado no importa qué, así que no importa.

    • A menos que, por supuesto, no es un Sistema.exit(); en algún lugar 😉
    • No, de hecho, no se acaba de conectar, hay algunas excepciones llamada asíncrona excepciones como la de StackOverflowException, ThreadAbortException y OutOfMemoryException que podría hacer que el bloque finally para no ser ejecutado. Leer acerca de las regiones de ejecución restringida para el manejo de estos escenarios.
    • Estas enlace lo explica: return y try…catch…finally Declaración
  3. 14

    Personalmente, me gustaría evitar este tipo de codificación como no tengo ganas de ver las sentencias return antes de que finalmente declaraciones.

    Mi mente es sencilla y los procesos de ti las cosas en lugar de lineal. Por lo tanto, cuando me paseo por el código para el funcionamiento en seco, voy a tener la tendencia a pensar que una vez que me puede llegar a la instrucción return, todo lo que siga no importa lo que obviamente es bastante malo en este caso (no es que esto afectaría a la instrucción return, pero ¿qué efectos secundarios podría ser).

    Por lo tanto, me gustaría organizar el código para que la instrucción return siempre aparecen después de que el finalmente declaraciones.

  4. 9

    Esto puede responder a su pregunta

    Lo que realmente sucede en un try { return x; } finally { x = null; } declaración?

    De la lectura que la pregunta suena como usted puede tener otro try catch estructura en la que finalmente declaración si usted piensa que podría lanzar una excepción. El compilador de la figura cuando para devolver el valor.

    Que, dijo, podría ser mejor para reestructurar el código de todos modos sólo para que no se confunda más tarde o a alguien que puede que no sean conscientes de esto.

    • hmmm muy interesante. Lo que significa que es seguro, pero eso no significa que se deba evitar?
    • Personalmente creo que se hace la lectura de su código un poco difícil y que por sí solo sería suficiente para averiguar alguna otra manera de estructurar el código. Pero en realidad es sólo una preferencia personal.
    • Tiendo a estar de acuerdo con sus preferencias personales 🙂
    • Yo creo que el retorno no está bien donde está. El método devolverá el valor, a menos que se lanza una excepción; no importa si la excepción surge en la que finalmente el código de limpieza.
    • Tenga en cuenta que la restricción de regreso de finalmente es no presente en Java (pero creo que la restricción es una buena – felicitaciones a C#).
    • No me importa lo que la gente hace tiempo que CONSTANTEMENTE hacer una cosa(o documento bien cuando no están en consonancia). Es muy molesto leer a alguien de la clase de donde son, evidentemente, poner enorme if/else cosas dentro de sus funciones de modo que sólo tienen una sola vuelta, al final de una función, y luego de repente lanzar un pronto retorno en sin previo aviso, en la siguiente función…

  5. 4

    Funcionalmente no hay ninguna diferencia.

    Sin embargo, hay una razón para no hacerlo. Más métodos con varios puntos de salida son a menudo más difíciles de leer y analizar. Pero esa objeción tiene más que ver con el retorno de las declaraciones de capturas y, finalmente, los bloques.

    • Yo reto como este, usted podría terminar con más de anidación que también hace que sea más difícil de leer a un alto ciclomático de complejidad
  6. 3

    En tu ejemplo es equivalente, ni siquiera me se sorprenda si el compilador genera el mismo código. Si una excepción ocurre en el bloque finally tiene los mismos problemas que coloque la instrucción return en bloque o fuera de ella.

    La verdadera pregunta es estilísticamente cual es el mejor. Me gusta escribir mis métodos, de modo que sólo hay una instrucción return, de esta manera es más fácil ver el flujo del método, se sigue que también me gusta poner la instrucción return último por lo que es fácil ver que es el final del método y este lo devuelve.

    Creo que con la instrucción return tan perfectamente colocado como la última instrucción, otros son menos propensos a entrar y espolvorear varias devoluciones declaraciones en otras partes del método.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea