Eviter que les erreurs des usercontrols, arretent le fonctionnement de la page

Description

Dans un de mes projets, je rajoute de nombreux UserControl dans ma page, mais si un Exception est lancé dans celui ci, je ne voulais pas que l'execution de la page s'arrete mais seulement l'execution du UserControl.

aprés beaucoup de recherche et test, je n'ai rien trouvé de rééellement convaincant :( la solution que je vous propose et de faire un overrides sur tous les lanceurs d'évenement "onLoad", "OnPreRender", etc... et de mettre un try catch dedans, ainsi toutes les erreurs liés au code de l'abonnement des événéments n'interferons pas la page.

Un exemple valant mieux qu'un long discours :

Nous avons un UserControl qui dans son load lance une Exception, normalement l'execution de la page s'arrete et affiche l'erreur. En héritant votre UserControl de monUserControl (la classe que j'ai écrites ci dessous) s'il y a une exception dans le load de la page, l'erreur sera capturé, et les autres événements ne seront pas déclenché mis à part l'evenement Error

Source / Exemple :


Imports Microsoft.VisualBasic
Imports System.Web

Public MustInherit Class MonUserControl
    Inherits System.Web.UI.UserControl

#Region " Gestion des exceptions dans l'UC "

    ' En faisant ces bidouilles, il y a trés peu de risques qu'un UC fasse planter toutes la page
    ' en tout cas c'est la meilleure facon que j'ai trouvé. Le mieux aurait été de pouvoir arreter
    ' tout fonctionnement de l'UC, mais ca m'a l'air impossible

    Private lastError As Exception = Nothing
    Private PlaceHolderError As PlaceHolder

    Protected NotOverridable Overrides Sub OnLoad(ByVal e As System.EventArgs)
        Try
            If lastError Is Nothing Then
                MyBase.OnLoad(e)
            End If
        Catch ex As Exception
            lastError = ex
            Me.OnError(e)
        End Try
    End Sub

    Protected NotOverridable Overrides Sub OnInit(ByVal e As System.EventArgs)
        Try
            If lastError Is Nothing Then
                MyBase.OnInit(e)
            End If
        Catch ex As Exception
            lastError = ex
            Me.OnError(e)
        End Try
    End Sub

    Protected NotOverridable Overrides Sub OnPreRender(ByVal e As System.EventArgs)
        Try
            If lastError Is Nothing Then
                MyBase.OnPreRender(e)
            End If
        Catch ex As Exception
            lastError = ex
            Me.OnError(e)
        End Try
    End Sub

    Protected NotOverridable Overrides Sub OnError(ByVal e As System.EventArgs)
        ' on log
        ' CSP.Utilities.Logs.WriteLine(TraceLevel.Error, lastError)
        MyBase.OnError(e)
    End Sub

    Protected NotOverridable Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        Try
            If lastError Is Nothing Then
                MyBase.Render(writer)
            ElseIf PlaceHolderError IsNot Nothing Then
                PlaceHolderError.RenderControl(writer)
            End If
        Catch ex As Exception
            Me.OnError(EventArgs.Empty)
        End Try
    End Sub

    ''' <summary>
    '''  on recupere les éventuelles erreurs provoqués dans le UserControl
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks></remarks>
    Private Sub Page_Error(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Error
        If PlaceHolderError Is Nothing Then
            PlaceHolderError = New PlaceHolder
        End If
        PlaceHolderError.Controls.Add(New LiteralControl("Une erreur a été détécté dans cet UserControl"))
    End Sub

#End Region

End Class

Conclusion :


Dans le zip, un exemple de mis en scéne

Un post trés interessant sur l'événement Error : http://weblogs.asp.net/vga/archive/2003/06/16/8748.aspx

Codes Sources

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.