Loger les erreurs dans un fichier xml

Contenu du snippet

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é

A voir également

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.