Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    View Cyril Durand's profile on LinkedIn

    hit counters

Evenement Error et UserControl, pas si simple que ca
Cette nuit m'est venu une problèmatique assez délicate.
 
Dans ma page, je charge plusieurs UserControl indépendants les uns des autres. Si l'un d'entre eux lance une exception il ne faut pas que ca empêche les autres de fonctionner, mais que cela affiche un message d'erreur à l'endroit ou est supposé être ce UserControl.
Or si on lance une exception dans un UserControl, celle ci est directement affiché et arrete l'execution de la page :-(
 
Je sais qu'un UserControl possede l'evenement Error qui selon la documentation "Occurs when an unhandled exception is thrown". Je m'abonne donc à l'evenement Error, lance une exception dans le load du UserControl et l'évenement n'est jamais lancé !!!
 
Me voila donc à la recherche d'explication. Avant de lancer Reflector, un petit tour sur mozbot qui me renvoie vers ce post : The not so clear Error event il explique en détail comment les erreurs sont gérés au sein d'une page (même pas besoin de lancer Reflector pour le voir de mes propres yeux :)). Tous se joue dans la méthode ProcessRequestMain(boolean, boolean) de l'objet Page (comme de trés nombreuses choses). Je ne vais pas rééxpliquer comment ca fonctionne puisque Victor Garcia Aprea le fait trés bien dans son post : The not so clear Error event et la conclusion à retenir est que l'évenement Error d'un UserControl ne sert à rien !
 
Sachant tout cela me voici à la recherche d'une solution. Ce que je veux c'est quand une exception est lancé dans mon UserControl, cela arrete le fonctionnement de celui ci et c'est tout! malheureusement aprés plusieurs heures de recherche et de test, je n'ai rien trouvé de réellement concluant. La seule solution que j'ai trouvé est de surchargé les méthodes OnEvent et d'entourer tout ca dans un bloc try :
 

Private lastError As Exception = Nothing

' on fait évidement la meme chose, pour OnInit, OnPrerender, etc...
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

Maintenant si une erreur est déclenché dans le load de l'UserControl, je la rattrape et l'evenement Error devient utile :)
 
Il me reste plus qu'a informer qu'il y a eu une erreur.
 

Private PlaceHolderError As PlaceHolder

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

Le problème est que ces bidouilles n'arretent pas l'execution du UserControl ! :-( en plus on ne recupere pas toutes les erreurs si on fait ca :

Protected Overrides Sub CreateChildControls()
     Throw New Exception
     MyBase.CreateChildControls()
End Sub

Alors c'est toute la page qui plante :-(
 
La solution que je vous propose ici : http://www.aspfr.com/codes/EVITER-ERREURS-USERCONTROLS-ARRETENT-FONCTIONNEMENT-PAGE_36510.aspx n'est donc pas parfaite mais elle suffira dans beaucoup des cas.
 
Si quelqu'un a une solution ou juste une idée de solution, je serais ravis de l'entendre :-)
Posted: dimanche 12 mars 2006 14:39 par cyril
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Piotrek a dit :

Salut

A mon avis, Error c'est un evenement qu'il faut lancer depuis un custom control en cas d'interception d'erreur dans le controle.

Ensuite, le probleme est le meme pour les usercontrols en winforms. L'exception se propage et plante l'appli si elle n'est pas interceptee.
Il faut donc que le composant gere lui meme les erreurs (si il ne la gere pas on apelle ca un bug) et qu'il redessine son interface en fontion.

Ta solution semble correcte (idem en winforms cela consisterait a capter les erreurs lors du chargement des controles dans la form a travers les evenements)

Bien sur je ne connais pas le dev ASP.Net suffisement, mais aucun controle winforms bien concu (la textbox par exemple) ne renvoie d'exception
# mars 13, 2006 08:36
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- [Expression Web] Astuce de la Semaine : Utilisation et Configuration des Extraits de Code par Chronos, Blog d'un Intégrateur .NET le il y a 15 heures et 3 minutes

- Faire de l'AJAX sans restrictions de domaine par Kévin Gosse le il y a 17 heures et 32 minutes

- [IronPython] : IronPython & Silverlight 2 - Part II par Kim's Blog le 07-22-2008, 14:50

- [WPF] Des requêtes NDepend pour analyser vos projets WPF par Thomas Lebrun le 07-21-2008, 09:27

- Liste de jeux pour Silverlight par Pierrick's Blog le 07-20-2008, 14:37

- T_PAAMAYIM_NEKUDOTAYIM par MadMatt le 07-19-2008, 16:16

- Et je mets le son.... par Pierrick's Blog le 07-19-2008, 12:09

- SharePoint : Comment interdire l’accès à un utilisateur pour tous les sites d’une Web Application par Blog Technique de Romelard Fabrice le 07-18-2008, 19:05

- VPC - Reset de la position de la console par Blog technique de Nicolas Boonaert le 07-18-2008, 16:29

- Un bug dans IE rendra cette page… non-imprimable ! par Le blog de FremyCompany le 07-18-2008, 15:33