Cette classe nous permet de loger les erreurs dans un fichier XML
pour l'utiliser, plusieurs méthodes s'offrent à vous, la plus simple : lorsqu'une erreur se produit vous faites :
Throw New Utility.ExceptionBase("data/erreur.xml", "Message", "Catégorie")
ou si vous ne voulez pas déclencher d'erreur mais juste ecrire dans le XML
Dim Ex as new Utility.ExceptionBase("data/erreur.xml", "Message", "Catégorie")
Source / Exemple :
Imports System.Xml
Imports System.IO
Namespace Utility
''' -----------------------------------------------------------------------------
''' Project : Cyril
''' Class : Utility.ExceptionBase
'''
''' -----------------------------------------------------------------------------
''' <summary>
''' Cette classe permet d'ecrire les exceptions survenus dans un fichier XML
'''
''' ** Bugs - Problèmes **
''' ~~~~~~~~~~~~~~~~~~~~~~
'''
''' - prenons l'exemple de ce code :
'''
''' Dim e As New ExceptionBase("/data/erreur.xml")
''' Dim i As Integer = 2
''' If Not i = 2 Then Throw e
'''
''' Dans ce cas Throw e ne sera pas appellé et il n'y aura pas eu d'erreur or puisqu'on
''' a initialisé e il a été ecrit dans le log d'erreur, c'est pour ca que j'ai rajouté une Guid
''' j'essaierais ensuite de rajouter une balise, disant si l'erreur a été juste demandé ou si
''' elle s'est produit, mais dans le dernier cas, il faudra appeller une methode pour changer la valeur de cette balise
'''
''' - pas d'autre problèmes jusqu'a maintenant
'''
''' </summary>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public Class ExceptionBase
Inherits Exception
#Region " Variable de classe "
'Variable contenant le nom du fichier XML
Private _XmlErrorFile As String
#End Region
#Region " Propriétés "
Private _Category As String
Private _Message As String
Private _HelpLink As String
Public Overrides ReadOnly Property Message() As String
Get
Return _Message
End Get
End Property
Public Overrides Property HelpLink() As String
Get
Return _HelpLink
End Get
Set(ByVal Value As String)
_HelpLink = Value
End Set
End Property
''' -----------------------------------------------------------------------------
''' <summary>
''' Assigne une catégorie à l'erreur, cela nous permet de l'ecrire dans le log
''' </summary>
''' <value></value>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Public ReadOnly Property Category() As String
Get
Return _Category
End Get
End Property
#End Region
#Region " new "
''' 4 Constructeurs different, je rajoute juste une option sur chaque en plus
Public Sub New(ByVal XmlErrorFile As String)
_Message = InnerException.Message
_Category = "none"
If Not Me.InnerException Is Nothing Then _HelpLink = Me.InnerException.HelpLink
_XmlErrorFile = XmlErrorFile
FirstTimeWritingError()
End Sub
Public Sub New(ByVal XmlErrorFile As String, ByVal Message As String)
_Message = Message
_Category = "none"
If Not Me.InnerException Is Nothing Then _HelpLink = Me.InnerException.HelpLink
_XmlErrorFile = XmlErrorFile
FirstTimeWritingError()
End Sub
Public Sub New(ByVal XmlErrorFile As String, ByVal Message As String, ByVal Category As String)
_Message = Message
_Category = Category
If Not Me.InnerException Is Nothing Then _HelpLink = Me.InnerException.HelpLink
_XmlErrorFile = XmlErrorFile
FirstTimeWritingError()
End Sub
Public Sub New(ByVal XmlErrorFile As String, ByVal Message As String, ByVal Category As String, ByVal Helplink As String)
_Message = Message
_Category = Category
_HelpLink = Helplink
_XmlErrorFile = XmlErrorFile
FirstTimeWritingError()
End Sub
#End Region
''' -----------------------------------------------------------------------------
''' <summary>
''' Function permettant de connaitre le numero de la derniere erreur + 1
'''
''' rien de bien particulier la dedans :
''' j'ouvre un document XML
''' je vais chercher le dernier noeud : donc la derniere erreur
''' puis je boucle sur tout les noeuds enfant jusqu'a ce que je retrouve le noeud number
''' une fois trouvé je lui ajoute 1 c'est donc le numero de l'erreur
''' si il le trouve pas c'est qu'il y a pas d'erreur donc le numero de l'erreur est 1
'''
''' </summary>
''' <returns></returns>
''' <remarks>
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Function Number() As Integer
Dim Doc As New XmlDocument
Doc.Load(_XmlErrorFile)
Dim mNodeRoot As XmlNode
mNodeRoot = Doc.DocumentElement
Dim mNodeChild As XmlNode
mNodeChild = mNodeRoot.LastChild
Dim mNodeSubChild As XmlNode = mNodeChild.FirstChild
Do Until mNodeSubChild Is Nothing
If mNodeSubChild.LocalName.ToLower = "Number".ToLower AndAlso IsNumeric(mNodeSubChild.InnerText) Then
Number = CType(mNodeSubChild.InnerText, Integer)
Else
Number = 1
End If
mNodeSubChild = mNodeSubChild.NextSibling
Loop
End Function
''' -----------------------------------------------------------------------------
''' <summary>
''' C'est ici que j'ecrit le fichier xml avec l'erreur
'''
''' le nom de la fonction vient du problème que j'ai trouvé,
''' je pense rajouté une fonction WriteError qui dirait que l'erreur s'est produit
''' </summary>
''' <remarks>
'''
''' Je regarde si le nom du fichier est correcte, s'il existe pas je suis bien emmerdé
''' j'ai choisis de rien faire, mais j'aurais pu mettre un fichier xml par défaut
'''
''' Ensuite je regarde s'il existe sinon je le crée
'''
''' Je le charge dans Doc, si j'arrive pas à le charger c'est qu'il y a une erreur, donc j'en fait un backup
'''
''' Enfin j'ecrit le fichier XML
'''
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Sub FirstTimeWritingError()
Dim FI As FileInfo
Try
FI = New FileInfo(_XmlErrorFile)
Catch ex As Exception
'Erreur dans le nom du fichier, je sais pas koi faire donc je retourne l'erreur tel quelle
Throw ex
End Try
If Not FI.Exists Then CreateXmlErrorFile()
Dim Doc As New XmlDocument
Try
Doc = New XmlDocument
Doc.Load(_XmlErrorFile)
'Erreur de syntaxe du XML : on fait un backup puis on recreer un fichier
Catch ex As XmlException
CreateBackup("Erreur")
FirstTimeWritingError()
Exit Sub
Catch ex As Exception
'une autre erreur, je sais pas d'ou elle provient je la retourne aussi telle quelle
Throw ex
End Try
Dim mElement As XmlElement
mElement = Doc.CreateElement("Erreur")
Dim mSubElement As XmlElement
'Number
mSubElement = Doc.CreateElement("Number")
mSubElement.InnerText = Number()
mElement.AppendChild(mSubElement)
'Date
mSubElement = Doc.CreateElement("Date")
mSubElement.InnerText = Now.ToString
mElement.AppendChild(mSubElement)
'Nom
mSubElement = Doc.CreateElement("Nom")
mSubElement.InnerText = Me.GetType.Name
mElement.AppendChild(mSubElement)
'Category
mSubElement = Doc.CreateElement("Category")
mSubElement.InnerText = _Category
mElement.AppendChild(mSubElement)
'Message
mSubElement = Doc.CreateElement("Message")
mSubElement.InnerText = _Message
mElement.AppendChild(mSubElement)
'HelpLink
mSubElement = Doc.CreateElement("HelpLink")
mSubElement.InnerText = _HelpLink
mElement.AppendChild(mSubElement)
'Fermeture du fichier
Doc.DocumentElement.AppendChild(mElement)
Doc.Save(_XmlErrorFile)
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Cette function créer un backup du fichier au cas ou il y ait une erreur puis recreer un fichier xml d'erreur
''' et ecrit l'erreur dans le fichier xml
''' </summary>
''' <param name="Reason">indique la raison pour laquelle on fait un backup</param>
''' <remarks>
''' Rien de bien particulier, c'est de la gestion de fichier.
''' Le nom du Backup sera de cette forme : erreur.backup.Erreur.samedi 26 juin 2004.15h7min7s.xml
''' si il y a deux fois une erreur dans la meme seconde, on garde le premier XML
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Sub CreateBackup(ByVal Reason As String)
Dim XMLFile As New FileInfo(_XmlErrorFile)
Dim NewFileName As String = Left(_XmlErrorFile, _XmlErrorFile.Length - XMLFile.Extension.Length) & ".backup." & Reason & "." & Now.ToLongDateString & "." & Now.Hour & "h" & Now.Minute & "min" & Now.Second & "s" & ".xml"
Dim FI As New FileInfo(NewFileName)
If Not FI.Exists Then XMLFile.CopyTo(NewFileName)
XMLFile.Delete()
CreateXmlErrorFile()
If Reason.ToLower = "erreur" Then
Dim Message As String = "Il y a eu un problème avec le precedent fichier xml" & vbNewLine & "l'ancien fichier à été enregistré sous le nom : " & NewFileName
Dim Ex As New ExceptionBase(_XmlErrorFile, Message, "Backup XmlFile")
End If
End Sub
''' -----------------------------------------------------------------------------
''' <summary>
''' Creation du fichier XML
''' </summary>
''' <remarks>
''' Rien de bien particulier, je relance une erreur si le nom du fichier ne me convient pas
''' </remarks>
''' <history>
''' [DURAND Cyril] 26/06/2004 Created
''' </history>
''' -----------------------------------------------------------------------------
Private Sub CreateXmlErrorFile()
Try
Dim FI As FileInfo
FI = New FileInfo(_XmlErrorFile)
If FI.Exists Then FI.Delete()
Catch ex As Exception
''' Certainement une erreur dans le nom du fichier
''' Je vois pas ce que je peux faire pour l'instant
''' je relance l'erreur
Throw ex
End Try
'Creation du Fichier XML
Dim XMLobj As Xml.XmlTextWriter
Dim ue As New System.[Text].UnicodeEncoding
XMLobj = New Xml.XmlTextWriter(_XmlErrorFile, ue)
'indentation etc...
XMLobj.Formatting = Xml.Formatting.Indented
XMLobj.Indentation = 3
XMLobj.WriteStartDocument()
XMLobj.WriteComment("XML crée par la gestion d'erreur de DURAND Cyril")
XMLobj.WriteComment("http://www.codes-sources.com/auteurdetail.aspx?ID=19303")
XMLobj.WriteStartElement("Erreurs") 'Erreurs
XMLobj.WriteElementString("CreationDate", Now.ToLongDateString)
XMLobj.WriteEndElement() '/Erreurs
XMLobj.Close()
End Sub
End Class
End Namespace
Conclusion :
Le code est relativement simple est un peu commenté, donc vous n'aurez je pense pas de problème pour le comprendre.
Merci de me laisser vos commentaires, de me signaler la presence d'eventuelle bug que vous aurez trouvé
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.