Visual Basic .NET Language
La gestion des erreurs
Recherche…
Essayer ... attraper ... enfin déclaration
Structure:
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
Exemple de code:
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
Créer une exception personnalisée et lancer
Vous pouvez créer une exception personnalisée et les lancer lors de l'exécution de votre fonction. En règle générale, vous ne devez lancer une exception que si votre fonction ne peut pas atteindre ses fonctionnalités définies.
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
Essayez Catch dans la base de données
Vous pouvez utiliser Try..Catch pour annuler l'opération de base de données en plaçant l'instruction de restauration au niveau du segment de capture.
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
L'exception non capturable
Bien que Catch ex As Exception
prétende pouvoir gérer toutes les exceptions, il existe une exception (sans jeu de mots).
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
Oups ... Il y a une System.StackOverflowException
alors que la console n'a même rien imprimé! Selon MSDN ,
À partir de .NET Framework 2.0, vous ne pouvez pas intercepter un objet StackOverflowException avec un bloc try / catch, et le processus correspondant se termine par défaut. Par conséquent, vous devez écrire votre code pour détecter et empêcher un débordement de pile.
Donc, System.StackOverflowException
est non capturable. Attention à ça!
Exceptions critiques
Généralement, la plupart des exceptions ne sont pas si critiques, mais il existe des exceptions très sérieuses que vous ne pourrez peut-être pas gérer, telles que la célèbre System.StackOverflowException
. Cependant, il y en a d'autres qui pourraient être masqués par une Catch ex As Exception
, tels que System.OutOfMemoryException
, System.BadImageFormatException
et System.InvalidProgramException
. C'est une bonne pratique de programmation de les laisser si vous ne pouvez pas les gérer correctement. Pour filtrer ces exceptions, nous avons besoin d'une méthode d'assistance:
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
Usage:
Try
SomeMethod()
Catch ex As Exception When Not IsCritical(ex)
Console.WriteLine("Exception caught: " & ex.Message)
End Try