De regreso en el Bloque Finally… ¿por Qué no?

Como MSDN menciona:

El código en un bloque Finally se ejecuta después de
una instrucción Return en un Try o Catch
el bloque se encuentra, pero antes de que
Volver instrucción se ejecuta. En este
situación, una instrucción Return en el
Bloque Finally se ejecuta antes de que el
inicial de la instrucción Return. Esto le da un
diferente valor de retorno. Para evitar
esto potencialmente confuso de la situación,
evite el uso de Retorno declaraciones en
Finalmente bloques.

Como yo no entiendo mucho de esta nota, voy a tomar un ejemplo (VB.NET creo que en C# es la situación es similar):

Try
    HugeOp()
    Return "OK"
Catch
    Return "NOK"
Finally
    Return "Finally"
End Try

Ahora, ¿por qué debería ser esto ilegal en C# y VB.NET?

Como siempre recomiendo, acaba de hacer un pequeño programa de prueba para emular el caso y ver por ti mismo.
es ilegal en C# (edit: y, parece, VB)
Trigo: La pregunta era PORQUE este
ah, entonces MSDN es confuso ; una mejor observación en MSDN sería «evitar el uso de Retorno declaraciones en bloques Finally, más que su código no compila»; he anotado MSDN para este efecto.
Una nota interesante: este es no ilegal en JavaScript. function m() { try { return 1; } finally { return 2; } } una llamada a m() devolverá 2. La aplicación que fue un verdadero dolor de cabeza para el equipo de desarrollo. Es también legal en Java.

OriginalEl autor serhio | 2011-04-26

3 Kommentare

  1. 25

    Es ilegal porque al llegar a la Finally bloque, el valor a devolver ya está definido («ACEPTAR» si todo salió bien «NOK» si una excepción fue capturado). Si eres capaz de devolver un valor diferente de la Finally bloque, este valor se siempre ser devueltos, cualquiera que sea el resultado de las instrucciones de arriba. Simplemente no tendría sentido…

    gracias. Así que «Finalmente» debe ser el valor de retorno. Hecho ilegal «de confundir» el código.
    No, el valor de retorno es el conjunto de antes el retorno de ejecutar la sentencia. Entre medio de esas dos cosas, el bloque finally se ejecuta. Por lo tanto, no tiene sentido tener una instrucción return en un bloque finally. No tiene sentido decir que, finalmente, «debería» ser el valor devuelto porque no tiene sentido que, finalmente, a tenía un valor de retorno.
    En otras palabras, en mi caso de éxito, el compilador toma «ACEPTAR» como valor de retorno, se ejecuta el bloque Finally, a continuación, toma el «OK» y efectivamente lo devuelve?
    La especificación puede definir el comportamiento de return en una instrucción finally sin embargo ella le gusta. Podría volver el antiguo valor de retorno, el nuevo valor de retorno o de ser ilegal. Cualquier si estos comportamientos es posible, y se eligió para hacer que sea ilegal. Y estoy de acuerdo con esa decisión.
    Buen punto.

    OriginalEl autor Thomas Levesque

  2. 2

    Tenía curiosidad acerca de esto, me estoy quedando en VS2010 y no permite un Retorno en el bloque finally. aquí está el código que he compilado

    Public Class Class1
       Public Shared Function test() As String
          Try
             Return "OK"
          Catch ex As Exception
             Return "Catch"
          Finally
             test = "Finally"
          End Try
       End Function
    End Class

    He compilado el archivo DLL para ver el código MSIL parecía bastante interesante, en el código anterior, básicamente obtiene refactorizado para esto:

    Public Class Class2
       Public Shared Function test() As String
          Try
             Try
                test = "OK"
             Catch ex As Exception
                test = "Catch"
             End Try
          Finally
             test = "Finally"
          End Try
    
          Return test
       End Function
    End Class

    y prueba de esto, el MSIL las dos clases es exactamente el mismo.

    así que, finalmente, encontró una manera de devolver en bloque finally en Visual Basic, el uso del nombre de la función, aunque confuso, hay una manera de hacerlo…

    OriginalEl autor Apeiron

  3. 1

    Supongo que la respuesta está en la pregunta. Es ilegal porque es confuso. No es intuitivo que el valor será devuelto. Si es ilegal, que se ven obligados a escribir el código en el que el flujo es mucho más clara.

    «confuso», «intuitivo», pero en realidad lo que debería ser el volver aquí después de que el compilador de las reglas? Es siempre «por fin»?
    Parece que el compilador el estado de las reglas es ilegal y no debe compilar. Así que la pregunta de qué se hace devolución no tiene sentido.
    leer la nota que he publicado. «Esto le da un diferente valor de retorno.»
    Estás nota es evidentemente inexacto y no describe el comportamiento de C# o VB.net. Por eso @MarcGravell sugirió que la documentación debe ser actualizado para ser coherente con el comportamiento real del compilador.
    Lo que es una advertencia violaría la especificación. «8.9.4 La instrucción return» – «es un error en tiempo de compilación para una instrucción return para aparecer en un bloque finally» (De la C# especificación)

    OriginalEl autor izb

Kommentieren Sie den Artikel

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

Pruebas en línea