Créer des pages de rapport d’erreurs personnalisées dans ASP.NET à l’aide de Visual Basic .NET

Cet article explique comment utiliser du code Microsoft Visual Basic .NET pour intercepter et répondre aux erreurs lorsqu’elles se produisent dans ASP.NET.

Version d’origine du produit : Visual Basic .NET, ASP.NET
Numéro de la base de connaissances d’origine : 308132

Résumé

ASP.NET a amélioré les options de gestion des erreurs à partir des pages ASP (Active Server Pages) traditionnelles. Dans ASP.NET, vous pouvez gérer les erreurs à plusieurs niveaux différents dans vos applications.

Nouvelles fonctionnalités dans ASP.NET

ASP.NET offre plusieurs avancées dans la façon dont vous pouvez gérer les erreurs et y répondre. Dans ASP traditionnel, vous gérez les erreurs avec On Error Resume Next (ou try-catch des blocs dans JScript). Si vous exécutez Internet Information Services (IIS), vous pouvez également utiliser l’objet ASPError pour créer une page de rapport d’erreurs personnalisée. Toutefois, ces approches ont leurs limites.

ASP.NET fournit plusieurs niveaux auxquels vous pouvez gérer et répondre aux erreurs qui peuvent se produire lorsque vous exécutez une application ASP.NET. ASP.NET fournit trois méthodes main qui vous permettent d’intercepter et de répondre aux erreurs lorsqu’elles se produisent : l’événementPage_Error, l’événement Application_Error et le fichier de configuration de l’application (Web.config).

Cet article explique comment utiliser ces nouvelles fonctionnalités dans votre application ASP.NET. Bien que cet article explique comment fournir des pages d’erreurs personnalisées et des rapports d’erreurs généraux en relation directe avec ASP.NET, cet article ne décrit pas d’autres approches de gestion des erreurs telles que le try-catch-finally bloc et le système d’exceptions CLR (Common Language Runtime).

Utiliser l’événement Page_Error

L’événement Page_Error permet d’intercepter les erreurs qui se produisent au niveau de la page. Vous pouvez afficher des informations d’erreur (comme le fait l’exemple de code à suivre), ou vous pouvez journaliser l’événement ou effectuer une autre action.

Remarque

Cet exemple affiche des informations détaillées sur les erreurs dans le navigateur uniquement à des fins de démonstration. Vous devez être prudent lors de l’affichage d’informations détaillées à l’utilisateur final de l’application, en particulier lorsque l’application s’exécute sur Internet. Une action plus appropriée consiste à afficher un message à l’utilisateur l’informant qu’une erreur s’est produite, puis à enregistrer les détails de l’erreur spécifique dans le journal des événements.

Cet exemple lève une exception null, ce qui force une erreur à se produire dans l’événement Page_Load . Procédez comme suit pour créer la page initiale qui testera l’événement Page_Error .

  1. Procédez comme suit pour ajouter un nouveau fichier nommé PageEvent.aspx à votre projet :

    1. Ouvrez Visual Studio .NET.
    2. Dans Explorateur de solutions, cliquez avec le bouton droit sur le nœud du projet, pointez sur Ajouter, puis cliquez sur Ajouter un formulaire web.
    3. Dans la zone de texte Nom , tapez PageEvent.aspx, puis cliquez sur Ouvrir.
  2. Ajoutez le code suivant à PageEvent.aspx :

    <%@ Page Language="vb"%>
    <script runat=server>
        Sub Page_Load(Sender as object, e as EventArgs)
           throw(new System.ArgumentNullException())
        End Sub
        Sub Page_Error(Sender as object, e as EventArgs)
           Dim objErr as Exception = Server.GetLastError().GetBaseException()
           Dim err as String = "<b>Error Caught in Page_Error event</b><hr><br>" & _
                               "<br><b>Error in: </b>" & Request.Url.ToString() & _
                               "<br><b>Error Message: </b>" & objErr.Message.ToString() & _
                               "<br><b>Stack Trace:</b><br>" & _objErr.StackTrace.ToString()
           Response.Write(err.ToString())
           Server.ClearError()
        End Sub
    </script>
    
  3. Dans le menu Fichier , cliquez sur EnregistrerPageEvent.aspx.

  4. Cliquez avec le bouton droit sur la page, puis cliquez sur Afficher dans le navigateur pour exécuter la page. Notez que l’erreur est levée et signalée conformément aux spécifications du code.

Remarque

Vous remarquerez peut-être que le code émet un appel à Server.ClearError. Cela empêche l’erreur de continuer à l’événement Application_Error à gérer.

Utiliser l’événement Application_Error

Comme pour l’événement Page_Error , vous pouvez utiliser l’événement Application_Error pour intercepter les erreurs qui se produisent dans votre application. En raison de l’étendue de l’événement à l’échelle de l’application, vous pouvez journaliser les informations d’erreur d’application ou gérer d’autres erreurs au niveau de l’application qui peuvent se produire.

L’exemple à suivre est basé sur l’exemple de code d’événement précédent Page_Error et est déclenché si l’erreur de l’événement Page_Load n’est pas interceptée dans l’événement Page_Error . L’événement Application_Error est spécifié dans le fichier Global.asax de votre application. Par souci de simplicité, les étapes de cette section créent une page dans laquelle lever l’exception, intercepter l’erreur en cas de fichier Global.asax et écrire l’erreur dans Application_Error le journal des événements. Les étapes suivantes montrent comment utiliser l’événement Application_Error :

  1. Ajoutez un nouveau fichier nommé AppEvent.aspx à votre projet.

  2. Ajoutez le code suivant à AppEvent.aspx :

    <script language=vb runat="server">
         Sub Page_Load(Sender as object, e as EventArgs)
             throw(new ArgumentNullException())
         End Sub
    </script>
    
  3. Dans le menu Fichier , cliquez sur EnregistrerAppEvent.aspx.

  4. Ajoutez l’événement Application_Error au fichier Global.asax pour intercepter l’erreur que vous générez en Page_Load cas de AppEvent.aspx page. Notez que vous devez ajouter une Imports instruction pour l’espace de System.Diagnostics noms global.asax afin d’utiliser le journal des événements.

    Ajoutez le code suivant au fichier Global.asax :

    Imports System.Diagnostics
    Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim objErr As Exception = Server.GetLastError().GetBaseException()
        Dim err As String = "Error Caught in Application_Error event" & _
                                System.Environment.NewLine & _
                                "Error in: " & Request.Url.ToString() & _
                                System.Environment.NewLine & _
                                "Error Message: " & objErr.Message.ToString() & _
                                System.Environment.NewLine & _
                                "Stack Trace:" & objErr.StackTrace.ToString()
        EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
        Server.ClearError()
        additional actions...
    End Sub
    
  5. Enregistrez le fichier Global.asax .

  6. Dans Visual Studio .NET, dans le menu Générer , cliquez sur Générer.

  7. Cliquez avec le bouton droit sur la page, puis cliquez sur Afficher dans le navigateur. Dans ce cas, la page est vide, mais vous devez remarquer qu’une nouvelle entrée a été ajoutée dans le journal des événements. Cet exemple crée une entrée dans le journal des applications, qui est accessible à partir du observateur d'événements. Après la journalisation de l’erreur, vous pouvez rediriger l’utilisateur vers une autre page d’erreur plus conviviale, ou effectuer des actions supplémentaires si nécessaire.

Utiliser le fichier Web.config

Si vous n’appelez Server.ClearError pas ou ne interceptez pas l’erreur dans l’événement Page_Error ou Application_Error , l’erreur est gérée en fonction des paramètres de la <customErrors> section du fichier Web.config . Dans la <customErrors> section , vous pouvez spécifier une page de redirection comme page d’erreur par défaut (defaultRedirect) ou spécifier sur une page particulière en fonction du code d’erreur HTTP (Hypertext Transfer Protocol) qui est déclenché. Vous pouvez utiliser cette méthode pour personnaliser le message d’erreur que l’utilisateur reçoit.

Si une erreur se produit et n’est pas interceptée à l’un des niveaux précédents de votre application, cette page personnalisée s’affiche. Cette section montre comment modifier le fichier Global.asax afin qu’il Server.ClearError ne soit jamais appelé. Par conséquent, l’erreur est gérée dans le fichier Web.config comme dernier point pour intercepter l’erreur.

  1. Ouvrez le fichier Global.asax de l’exemple précédent.

  2. Commentez la Server.ClearError ligne pour vous assurer que l’erreur apparaît dans le fichier Web.config .

  3. Enregistrez vos modifications dans Global.asax. Votre code doit maintenant ressembler à ce qui suit :

     Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
         Dim objErr As Exception = Server.GetLastError().GetBaseException()
         Dim err As String = "Error Caught in Application_Error event" & _
                             System.Environment.NewLine & _
                             "Error in: " & Request.Url.ToString() & _
                             System.Environment.NewLine & _
                             "Error Message: " & objErr.Message.ToString() & _
                             System.Environment.NewLine & _
                             "Stack Trace:" & objErr.StackTrace.ToString()
         EventLog.WriteEntry("Sample_WebApp", err, EventLogEntryType.Error)
         Server.ClearError()
         additional actions...
     End Sub
    
  4. Ajoutez le code suivant à la <customErrors> section pour rediriger l’utilisateur vers une page personnalisée :

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
    </customErrors>
    

    Remarque

    Vous devez modifier le chemin d’accès au fichier dans defaultRedirect l’attribut afin qu’il fasse référence aux noms de serveur web et d’application appropriés.

  5. Étant donné que les erreurs interceptées à ce niveau sont envoyées à une page d’erreur par défaut, vous devez créer une page d’erreur nommée ErrorStatus.htm. Gardez à l’esprit que vous utilisez cette méthode pour contrôler ce qui est présenté à l’utilisateur. Cet exemple utilise donc une page .htm pour la page d’erreur. Ajoutez le code suivant à ErrorStatus.htm:

    <HTML>
        <HEAD>
            <TITLE></TITLE>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 7.0">
        </HEAD>
        <BODY>
             <b>Custom Error page!</b>
             <br>
             You have been redirected here from the <customErrors> section of the
             Web.config file.
        </BODY>
    </HTML>
    
  6. Pour tester le code, enregistrez les fichiers, générez le projet, puis affichez AppEvent.aspx dans le navigateur. Notez que lorsque l’erreur est levée, vous êtes redirigé vers la page ErrorStatus.htm . Bien que vous puissiez référencer une page d’erreur par défaut dans la valeur de l’attribut defaultRedirect dans la <customErrors> section, vous pouvez également spécifier une page particulière vers laquelle effectuer la redirection en fonction du code d’erreur HTTP déclenché. L’élément <error> enfant autorise cette option. Par exemple :

    <customErrors defaultRedirect="http://hostName/applicationName/errorStatus.htm" mode="On">
        <error statusCode="404" redirect="filenotfound.htm"/>
    </customErrors>
    

Remarque

La page spécifiée dans defaultRedirect la <customErrors> section est un fichier .htm . Si vous envisagez d’utiliser GetLastError dans une page .aspx (ce que font les Page_Error exemples et Application_Error ), vous devez stocker l’exception dans une variable de session ou une autre approche avant que la redirection ait lieu.

Notez que la <customErrors> section inclut un mode attribut défini sur On . L’attribut mode est utilisé pour contrôler la façon dont la redirection d’erreur se produit. Par exemple, si vous développez l’application, vous souhaitez probablement voir les messages d’erreur ASP.NET réels et ne souhaitez pas être redirigé vers la page d’erreur plus conviviale. L’attribut mode inclut les paramètres suivants :

  • On: les exceptions non gérées redirigent l’utilisateur vers la page spécifiée defaultRedirect . Il mode est principalement utilisé en production.

  • Off: les utilisateurs reçoivent les informations d’exception et ne sont pas redirigés vers la defaultRedirect page. Il mode est utilisé principalement dans le développement.

  • RemoteOnly: seuls les utilisateurs qui accèdent au site sur l’ordinateur local (à l’aide de localhost) reçoivent les informations d’exception. Tous les autres utilisateurs sont redirigés vers la defaultRedirect page. Ce mode est principalement utilisé pour le débogage.

Résolution des problèmes

Dans son installation par défaut sur Windows, ASP.NET exécute le code de l’application web dans un processus de travail. L’identité de ce processus est définie par défaut sur un compte local non privilégié appelé compte ASPNET . Dans les versions bêta de ASP.NET, l’identité du processus était Système, un compte d’administration puissant avec de nombreux privilèges sur l’ordinateur.

Dans son installation par défaut sur Windows Server (IIS), ASP.NET exécute le code de l’application web dans un processus de travail. L’identité de ce processus est définie par défaut sur un compte limité appelé NetworkService.

Pour plus d’informations sur cette modification et sur la façon dont elle peut affecter l’exécution du code dans cet article, ainsi que sur d’autres codes pouvant nécessiter des droits d’accès supplémentaires, consultez modèles & pratiques

References