usar try español ejemplos como catch .net try-catch-finally

.net - español - try catch vb6



Regresa en el Bloque Finalmente... ¿Por qué no? (3)

Es ilegal porque cuando llega al bloque Finally , el valor a devolver ya está definido ("OK" si todo salió bien, "NOK" si se detectó una excepción). Si pudiera devolver un valor diferente del bloque Finally , este valor siempre se devolvería, sea cual sea el resultado de las instrucciones anteriores. Simplemente no tendría sentido ...

Como mentions MSDN:

El código en un bloque Finally se ejecuta después de que se encuentre una instrucción Return en un bloque Try o Catch, pero antes de que se ejecute esa instrucción Return. En esta situación, una instrucción de retorno en el bloque Finally se ejecuta antes de la instrucción de retorno inicial. Esto da un valor de retorno diferente. Para evitar esta situación potencialmente confusa, evite usar declaraciones de Devolución en los bloques Finalmente.

Como no entendí mucho de esta nota, tomaré un ejemplo (VB.NET, creo que en C # la situación es similar):

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

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


Supongo que la respuesta está en la pregunta. Es ilegal porque es confuso. No es intuitivo qué valor se devolverá. Si es ilegal, estás obligado a escribir código donde el flujo es mucho más claro.


Tenía curiosidad acerca de esto, estoy ejecutando VS2010 y no permite un retorno en el bloque final. Aquí está el código que compilé

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

Compilé la DLL para ver la MSIL. Parecía bastante interesante. El código anterior básicamente se refacta a 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 probando esto, la MSIL para las dos clases anteriores es exactamente la misma.