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
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.