Créer des pages de création de rapports d’erreurs personnalisées dans ASP.NET à l’aide de Visual Basic .NET
Cet article explique comment utiliser le code Microsoft Visual Basic .NET pour intercepter et répondre aux erreurs lorsqu’elles se produisent dans ASP.NET.
Version du produit d’origine : Visual Basic .NET, ASP.NET
Numéro de base de connaissances d’origine : 308132
Résumé
ASP.NET a amélioré les options de gestion des erreurs à partir des pages Active Server traditionnelles (ASP). Dans ASP.NET, vous pouvez gérer les erreurs à plusieurs niveaux différents dans vos applications.
Nouvelles fonctionnalités dans ASP.NET
ASP.NET propose plusieurs avancées dans la façon dont vous pouvez gérer et répondre aux erreurs. Dans ASP classique, vous gérez les erreurs avec On Error Resume Next
(ou try-catch
les blocs dans JScript). Sinon, si vous exécutez Internet Information Services (IIS), vous utilisez l’objet ASPError
pour créer une page de rapport d’erreurs personnalisée. Toutefois, ces approches présentent leurs limitations.
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 principales qui vous permettent de intercepter et de répondre aux erreurs lorsqu’elles se produisent : l’événement Page_Error
, l’événement Application_Error
et le fichier de configuration de l’application (Web.config).
Cet article montre comment utiliser ces nouvelles fonctionnalités dans votre application ASP.NET. Bien que cet article décrit comment fournir des pages d’erreurs personnalisées et des rapports d’erreurs généraux, car il se rapporte directement à 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 l’exemple de code à suivre), ou vous pouvez enregistrer l’événement ou effectuer une autre action.
Note
Cet exemple affiche des informations d’erreur détaillées 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 qui les avertit qu’une erreur s’est produite, puis à journaliser les détails spécifiques de l’erreur 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
. Suivez ces étapes pour créer la page initiale qui testera l’événement Page_Error
.
Procédez comme suit pour ajouter un nouveau fichier nommé PageEvent.aspx à votre projet :
- Ouvrez Visual Studio .NET.
- 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.
- Dans la zone de texte Nom , tapez PageEvent.aspx, puis cliquez sur Ouvrir.
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>
Dans le menu Fichier , cliquez sur Enregistrer PageEvent.aspx.
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 en fonction des spécifications du code.
Note
Vous remarquerez peut-être que le code émet un appel à Server.ClearError
. Cela empêche la gestion de l’erreur vers l’événement Application_Error
.
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’application de l’événement, vous pouvez consigner des 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 dans l’événement Page_Load
n’a pas été 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 nouvelle page dans laquelle lever l’exception, interceptez l’erreur en Application_Error
cas de fichier Global.asax et écrivez l’erreur dans le journal des événements. Les étapes suivantes montrent comment utiliser l’événement Application_Error
:
Ajoutez un nouveau fichier nommé AppEvent.aspx à votre projet.
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>
Dans le menu Fichier , cliquez sur Enregistrer AppEvent.aspx.
Ajoutez l’événement
Application_Error
au fichier Global.asax pour intercepter l’erreur que vous liez enPage_Load
cas de page AppEvent.aspx . Notez que vous devez ajouter uneImports
instruction pour l’espaceSystem.Diagnostics
de noms à Global.asax pour 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
Enregistrez le fichier Global.asax .
Dans Visual Studio .NET, dans le menu Générer , cliquez sur Générer.
Cliquez avec le bouton droit sur la page, puis cliquez sur Afficher dans le navigateur. Dans ce cas, la page est vide. Toutefois, 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, accessible à partir de l’Observateur d’événements. Après avoir 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 interceptez l’erreur dans le ou Application_Error
l’événementPage_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 en tant que page d’erreur par défaut (defaultRedirect
) ou spécifier à une page particulière en fonction du code d’erreur HTTP (Hypertext Transfer Protocol) déclenché. Vous pouvez utiliser cette méthode pour personnaliser le message d’erreur reçu par l’utilisateur.
Si une erreur se produit qui 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.
Ouvrez le fichier Global.asax de l’exemple précédent.
Commentez la
Server.ClearError
ligne pour vous assurer que l’erreur s’affiche dans le fichier Web.config .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
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>
Note
Vous devez modifier le chemin d’accès du fichier dans l’attribut
defaultRedirect
afin qu’il référence le serveur web et les noms d’applications appropriés.Étant donné que les erreurs qui sont 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. N’oubliez pas 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>
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 à rediriger vers la base 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>
Note
La page spécifiée dans defaultRedirect
la <customErrors>
section est un fichier .htm . Si vous envisagez d’utiliser GetLastError
dans une page de .aspx (que les Page_Error
et Application_Error
exemples font), vous devez stocker l’exception dans une variable de session ou une autre approche avant la redirection.
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’erreurs se produit. Par exemple, si vous développez l’application, vous souhaiterez probablement voir les messages d’erreur réels ASP.NET 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éedefaultRedirect
. Cecimode
est principalement utilisé en production.Off
: les utilisateurs reçoivent les informations d’exception et ne sont pas redirigés vers ladefaultRedirect
page. Cecimode
est principalement utilisé 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 ladefaultRedirect
page. Ce mode est principalement utilisé pour le débogage.
Dépannage
Dans son installation par défaut sur Windows, ASP.NET exécute du code d’application web dans un processus de travail. L’identité de ce processus est par défaut un compte local non privilégié appelé compte ASPNET . Dans les versions bêta de ASP.NET, l’identité de 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 du code d’application web dans un processus de travail. L’identité de ce processus est par défaut 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 d’autres codes susceptibles de nécessiter des droits d’accès supplémentaires, consultez les modèles &pratiques