Lorsqu'une erreur se produit sur une page, ASP.NET envoie des informations sur cette erreur au client. Les erreurs sont réparties dans quatre catégories :
- Erreurs de configuration : Se produisent lorsque la syntaxe ou la structure d'un fichier Web.config de la hiérarchie de la configuration est incorrecte.
- Erreurs d'analyse : Se produisent lorsque la syntaxe ASP.NET d'une page est incorrecte.
- Erreurs de compilation : Se produisent lorsque des instructions dans la langue cible d'une page sont incorrectes.
- Erreurs d'exécution : Se produisent pendant l'exécution d'une page, même si les erreurs n'ont pas pu être détectées au moment de la compilation.
Par défaut, c'est la pile des appels qui est indiquée en cas d'erreur d'exécution (c'est-à-dire les chaînes d'appels de procédure menant à l'exception). Si le mode débogage est activé, ASP.NET affiche le numéro de la ligne du code source qui a généré l'erreur d'exécution. Le mode débogage est un outil pratique pour le débogage de votre application. Vous pouvez activer le mode débogage au niveau de la page à l'aide de la directive suivante :
Vous pouvez également activer le mode débogage au niveau de l'application en utilisant le fichier Web.config du répertoire racine de l'application comme le montre l'exemple suivant.
Remarque : L'exécution du mode débogage entraîne une forte dégradation des performances. N'oubliez pas de le désactiver avant de déployer votre application terminée.
L'exemple suivant illustre l'utilisation du mode débogage pour afficher les numéros de ligne source relatifs à une exception d'exécution.
Personnalisation des pages d'erreurs
Selon les circonstances, il est possible de traiter les erreurs d'application de différentes manières. Par exemple, au moment du développement, vous souhaiterez probablement consulter les pages d'erreurs détaillées fournies par ASP.NET pour vous aider à identifier et à résoudre les problèmes. Cependant, une fois l'application prise en charge dans un environnement de production, il est possible d'obtenir que vos clients soient informés, dans le détail, des erreurs survenues. Vous pouvez utiliser ASP.NET pour spécifier si les erreurs doivent être communiquées aux clients locaux, aux clients distants ou aux deux. Par défaut, les erreurs sont communiquées uniquement aux clients locaux (les clients du même ordinateur que le serveur). Vous pouvez également spécifier une page d'erreurs personnalisée vers laquelle rediriger les clients si une erreur survient.
Les erreurs personnalisées peuvent être activées dans le fichier Web.config de l'application. Par exemple :
<configuration>
<system.web>
<customErrors defaultRedirect="genericerror.htm" mode="remoteonly" />
</system.web>
</configuration>
Cette configuration permet aux clients locaux de consulter les pages d'erreurs détaillées ASP.NET par défaut, mais redirige les clients distants vers une page personnalisée appelée genericerror.htm. Cette page peut également être une page .aspx. ASP.NET passe le chemin d'accès de la page sur laquelle l'erreur s'est produite à la page d'erreurs sous la forme d'un argument QueryString. Remarquez que si l'exécution de la page d'erreurs génère une erreur, une page vide est renvoyée au client distant.
<%@ Page Language="C#" Description="Error page"%>
<html>
<head>
<title>Error page</title>
</head>
<body>
<h1>Error page</h1>
Error originated on: <%=Request.QueryString["ErrorPage"] %>
</body>
</html>
<%@ Page Language="VB" Description="Error page"%>
<html>
<head>
<title>Error page</title>
</head>
<body>
<h1>Error page</h1>
Error originated on: <%=Request.QueryString("ErrorPage") %>
</body>
</html>
<%@ Page Language="JScript" Description="Error page"%>
<html>
<head>
<title>Error page</title>
</head>
<body>
<h1>Error page</h1>
Error originated on: <%=Request.QueryString["ErrorPage"] %>
</body>
</html>
|
|
C#
|
VB
|
JScript
|
|
Remarque : Seuls les fichiers mappés à l'extension XSPISAPI.dll dans IIS entraînent ces erreurs. Les fichiers qui ne sont pas pris en charge à l'aide de XSPISAPI.dll ne sont pas traités par ASP.NET et génèrent des erreurs IIS. Pour plus d'informations sur la configuration des erreurs personnalisées IIS, consultez la documentation de IIS.
Le tableau suivant décrit les attributs et valeurs de configuration de la balise <customerrors>.
| Attribut | Description |
|
Mode
|
Indique si les erreurs personnalisées sont activées, désactivées ou s'affichent seulement sur les ordinateurs distants. Valeurs : On, Off, RemoteOnly (par défaut).
|
|
DefaultRedirect
|
Indique l'URL par défaut vers laquelle un navigateur doit être redirigé en cas d'erreur. Cet attribut est facultatif.
|
L'attribut Mode détermine si les erreurs doivent être communiquées aux clients locaux, aux clients distants ou aux deux. Les effets de chaque paramètre sont décrits dans le tableau suivant.
| Mode | Demande de l'hôte local | Demande de l'hôte distant |
|
On
|
Page d'erreurs personnalisée.
|
Page d'erreurs personnalisée.
|
|
Off
|
Page d'erreurs ASP.NET.
|
Page d'erreurs ASP.NET.
|
|
RemoteOnly
|
Page d'erreurs ASP.NET.
|
Page d'erreurs personnalisée.
|
L'exemple suivant illustre l'utilisation de la section de configuration <customerrors>.
Vous pouvez soit rediriger l'utilisateur vers une page commune pour toutes les erreurs, soit affecter des pages d'erreurs spécifiques à des codes d'état d'erreur particuliers. La section de configuration <customerrors> prend en charge une balise <error> interne qui associe des codes d'état HTTP aux pages d'erreurs personnalisées. Par exemple :
<configuration>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/genericerror.htm">
<error statusCode="500" redirect="/error/callsupport.htm"/>
<error statusCode="404" redirect="/error/notfound.aspx"/>
<error statusCode="403" redirect="/error/noaccess.aspx"/>
</customErrors>
</system.web>
</configuration>
Le tableau suivant décrit les attributs et valeurs de la balise <error>.
| Attribut | Description |
|
StatusCode
|
Code d'état HTTP des erreurs pour lesquelles la page d'erreurs personnalisée doit être utilisée. Exemples : 403 Interdit, 404 Introuvable ou 500 Erreur interne du serveur.
|
|
Redirect
|
URL vers laquelle le navigateur client doit être redirigé en cas d'erreur.
|
L'exemple suivant illustre l'utilisation de la balise <error>. Remarquez que l'exemple spécifie une page .aspx pour des erreurs « Fichier introuvable », manière à pouvoir afficher l'URL de page manquante passée par l'intermédiaire de QueryString.
Gestion des erreurs par programme
Vous pouvez également gérer les erreurs du code soit au niveau de la page, soit au niveau de l'application. La classe de base Page expose une méthode Page_Error que vous pouvez substituer dans vos pages. Cette méthode est appelée chaque fois qu'une exception non interceptée est levée au moment de l'exécution.
<script language="C#" runat="server">
void Page_Error(Object source, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
</script>
<script language="C#" runat="server">
Sub Page_Error(Source As Object, E As EventArgs)
Dim message As String = "<font face=verdana color=red>" _
& "<h4>" & Request.Url.ToString() & "</h4>" _
& "<pre><font color='red'>" & Server.GetLastError().ToString() & "</pre>" _
& "</font>"
Response.Write(message)
End Sub
</script>
<script language="JScript" runat="server">
function Page_Error(source:Object, e:EventArgs) : void {
var message:String = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
</script>
|
|
C#
|
VB
|
JScript
|
|
L'exemple suivant illustre la méthode Page_Error.
Cette méthode permet d'effectuer des opérations utiles, telles que l'envoi à l'administrateur du site d'un message électronique indiquant que la page ne s'est pas exécutée correctement. ASP.NET fournit un ensemble de classes dans l'espace de noms System.Web.Mail dans ce seul but. Pour importer cet espace de noms, utilisez une directive @Import en début de page, de la manière suivante :
<%@ Import Namespace="System.Web.Mail" %>
Vous pouvez ensuite utiliser les objets MailMessage et SmtpMail pour envoyer un message électronique par programme.
MailMessage mail = new MailMessage();
mail.From = "automated@contoso.com";
mail.To = "administrator@contoso.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
Dim mail As New MailMessage
mail.From = "automated@contoso.com"
mail.To = "administrator@contoso.com"
mail.Subject = "Site Error"
mail.Body = message
mail.BodyFormat = MailFormat.Html
SmtpMail.Send(mail)
var mail:MailMessage = new MailMessage();
mail.From = "automated@contoso.com";
mail.To = "administrator@contoso.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
|
|
C#
|
VB
|
JScript
|
|
L'exemple suivant illustre l'envoi d'un message électronique consécutif à une erreur de page.
Remarque : Cet exemple n'envoie pas réellement de message aussi longtemps que vous n'avez pas configuré le service de messagerie SMTP sur votre ordinateur. Pour plus d'informations sur le service de messagerie SMTP, consultez la documentation de IIS.
Outre la gestion des erreurs au niveau de la page, il est possible de gérer les erreurs au niveau de l'application. Dans ce but, utilisez l'événement Application_Error dans le fichier Global.asax. Cet événement se produit pour toute exception non gérée levée dans l'application.
void Application_Error(Object sender, EventArgs e) {
//...Do something here
}
Sub Application_Error(sender As Object, e As EventArgs)
'...Do something here
End Sub
function Application_Error(sender:Object, e:EventArgs) : void {
//...Do something here
}
|
|
C#
|
VB
|
JScript
|
|
Écriture dans le journal des événements
L'espace de noms System.Diagnostics fournit des classes pour l'écriture dans le journal des événements Windows. Pour utiliser cet espace de noms dans vos pages, vous devez d'abord l'importer de la manière suivante :
<%@ Import Namespace="System.Diagnostics"%>
La classe EventLog encapsule le journal proprement dit. Elle fournit des méthodes statiques pour la détection ou la création de journaux et peut être instanciée pour écrire des entrées de journal à partir de code. L'exemple suivant illustre cette fonctionnalité dans la méthode Application_Error du fichier Global.asax. Chaque fois qu'une exception non gérée se produit dans l'application, une entrée contenant le message d'erreur et la trace de la pile est créée dans le journal de l'application.
void Application_Error(Object sender, EventArgs e) {
String Message = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create event Log if it does not exist
String LogName = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into event log
EventLog Log = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
Sub Application_Error(sender As Object, e As EventArgs)
Dim Message As String = "\n\nURL:\n http://localhost/" & Request.Path _
& "\n\nMESSAGE:\n " & Server.GetLastError().Message _
& "\n\nSTACK TRACE:\n" & Server.GetLastError().StackTrace
' Create event log if it does not exist
Dim LogName As String = "Application"
If (Not EventLog.SourceExists(LogName))
EventLog.CreateEventSource(LogName, LogName)
End If
' Insert into event log
Dim Log As New EventLog
Log.Source = LogName
Log.WriteEntry(Message, EventLogEntryType.Error)
End Sub
function Application_Error(sender:Object, e:EventArgs) : void {
var Message:String = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create event log if it does not exist
var LogName:String = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into event log
var Log:EventLog = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
|
|
C#
|
VB
|
JScript
|
|
Vous trouverez ci-dessous le code source complet de l'exemple précédent. Remarquez que ce code est désactivé de sorte qu'il ne puisse pas s'exécuter ici, afin d'empêcher des entrées d'être écrites dans votre journal des événements Windows. Si vous souhaitez voir ce code s'exécuter, créez une racine virtuelle IIS pointant vers le répertoire qui contient ce fichier.
- Les erreurs sont réparties en quatre catégories : erreurs de configuration, erreurs d'analyse, erreurs de compilation et erreurs d'exécution.
- Par défaut, c'est la pile des appels qui est indiquée en cas d'erreur d'exécution (c'est-à-dire la chaîne d'appels de procédure menant à l'exception). Si le mode débogage est activé, ASP.NET affiche le numéro de la ligne du code source qui a généré l'erreur d'exécution.
- ASP.NET permet de spécifier si les erreurs doivent être communiquées aux clients locaux, aux clients distants ou aux deux. Par défaut, les erreurs sont communiquées uniquement aux clients locaux (les clients du même ordinateur que le serveur). Vous pouvez également spécifier une page d'erreurs personnalisée vers laquelle rediriger les clients si une erreur survient.
- Vous pouvez soit rediriger l'utilisateur vers une page commune pour toutes les erreurs, soit affecter des pages d'erreurs spécifiques à des codes d'état d'erreur particuliers. La section de configuration <customerrors> prend en charge une balise <error> interne qui associe des codes d'état HTTP à des pages d'erreurs personnalisées.
- Vous pouvez également gérer les erreurs du code soit au niveau de la page, soit au niveau de l'application. La classe de base Page expose une méthode HandleError que vous pouvez substituer dans vos pages. Cette méthode est appelée chaque fois qu'une exception non interceptée est levée au moment de l'exécution.
- L'espace de noms System.Web.Mail expose des classes pour envoyer un message électronique par programme. Cela peut s'avérer utile pour signaler une erreur à un administrateur.
- Outre la gestion des erreurs au niveau de la page, vous pouvez utiliser l'événement Application_Error du fichier Global.asax pour gérer les erreurs au niveau de l'application. Cet événement se produit pour toute exception non gérée levée dans l'application.
- L'espace de noms System.Diagnostics fournit des classes pour l'écriture dans le journal des événements Windows.