.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.