Visual Basic .NET Language
Manejo de errores
Buscar..
Intenta ... Atrapa ... Finalmente Declaración
Estructura:
Try
'Your program will try to run the code in this block.
'If any exceptions are thrown, the code in the Catch Block will be executed,
'without executing the lines after the one which caused the exception.
Catch ex As System.IO.IOException
'If an exception occurs when processing the Try block, each Catch statement
'is examined in textual order to determine which handles the exception.
'For example, this Catch block handles an IOException.
Catch ex As Exception
'This catch block handles all Exception types.
'Details of the exception, in this case, are in the "ex" variable.
'You can show the error in a MessageBox with the below line.
MessageBox.Show(ex.Message)
Finally
'A finally block is always executed, regardless of if an Exception occurred.
End Try
Código de ejemplo:
Try
Dim obj = Nothing
Dim prop = obj.Name 'This line will throw a NullReferenceException
Console.WriteLine("Test.") ' This line will NOT be executed
Catch ex As System.IO.IOException
' Code that reacts to IOException.
Catch ex As NullReferenceException
' Code that reacts to a NullReferenceException
Console.WriteLine("NullReferenceException: " & ex.Message)
Console.WriteLine("Stack Trace: " & ex.StackTrace)
Catch ex As Exception
' Code that reacts to any other exception.
Finally
' This will always be run, regardless of if an exception is thrown.
Console.WriteLine("Completed")
End Try
Creando excepciones y lanzamientos personalizados.
Puede crear una excepción personalizada y lanzarlas durante la ejecución de su función. Como práctica general, solo debe lanzar una excepción cuando su función no pueda lograr su funcionalidad definida.
Private Function OpenDatabase(Byval Server as String, Byval User as String, Byval Pwd as String)
if Server.trim="" then
Throw new Exception("Server Name cannot be blank")
elseif User.trim ="" then
Throw new Exception("User name cannot be blank")
elseif Pwd.trim="" then
Throw new Exception("Password cannot be blank")
endif
'Here add codes for connecting to the server
End function
Intenta atrapar en la operación de base de datos
Puede usar Try..Catch para deshacer la operación de la base de datos colocando la instrucción de retrotracción en el segmento de captura.
Try
'Do the database operation...
xCmd.CommandText = "INSERT into ...."
xCmd.ExecuteNonQuery()
objTrans.Commit()
conn.Close()
Catch ex As Exception
'Rollback action when something goes off
objTrans.Rollback()
conn.Close()
End Try
La excepción irrecuperable
Aunque Catch ex As Exception
afirma que puede manejar todas las excepciones, hay una excepción (no pretendía hacer un juego de palabras).
Imports System
Static Sub StackOverflow() ' Again no pun intended
StackOverflow()
End Sub
Static Sub Main()
Try
StackOverflow()
Catch ex As Exception
Console.WriteLine("Exception caught!")
Finally
Console.WriteLine("Finally block")
End Try
End Sub
¡Vaya! Hay una excepción System.StackOverflowException
capturada, ¡mientras que la consola ni siquiera imprimió nada! Según MSDN ,
A partir de .NET Framework 2.0, no puede capturar un objeto StackOverflowException con un bloque try / catch, y el proceso correspondiente finaliza de forma predeterminada. En consecuencia, debe escribir su código para detectar y evitar un desbordamiento de pila.
Por lo tanto, System.StackOverflowException
no se puede capturar. ¡Cuidado con eso!
Excepciones criticas
En general, la mayoría de las excepciones no son tan importantes, pero hay algunas excepciones realmente serias que tal vez no pueda manejar, como la famosa excepción System.StackOverflowException
. Sin embargo, hay otros que pueden quedar ocultos por Catch ex As Exception
, como System.OutOfMemoryException
, System.BadImageFormatException
y System.InvalidProgramException
. Es una buena práctica de programación omitirlos si no puede manejarlos correctamente. Para filtrar estas excepciones, necesitamos un método auxiliar:
Public Shared Function IsCritical(ex As Exception) As Boolean
Return TypeOf ex Is OutOfMemoryException OrElse
TypeOf ex Is AppDomainUnloadedException OrElse
TypeOf ex Is AccessViolationException OrElse
TypeOf ex Is BadImageFormatException OrElse
TypeOf ex Is CannotUnloadAppDomainException OrElse
TypeOf ex Is ExecutionEngineException OrElse ' Obsolete one, but better to include
TypeOf ex Is InvalidProgramException OrElse
TypeOf ex Is System.Threading.ThreadAbortException
End Function
Uso:
Try
SomeMethod()
Catch ex As Exception When Not IsCritical(ex)
Console.WriteLine("Exception caught: " & ex.Message)
End Try