2009-03-11 4 views
4

Je souhaite créer une page d'erreur personnalisée pour gérer toutes les exceptions non gérées.Comment créer une page d'erreur détaillée?

Je souhaite rediriger vers la méthode Application_Error(object sender, EventArgs e) située dans Global.asax.cs. Comment puis-je montrer quelques informations détaillées de l'exception qui jette l'erreur d'application?

Répondre

3

J'ai fait la même chose dont vous parlez. J'ai créé un ErrorPage qui affiche des informations à l'utilisateur. J'ai également créé une fonction qui écrit les informations d'erreur dans les journaux d'événements ...

Pour la page, voici ce que je fais. Il suffit de mettre les étiquettes là-bas quelque part ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    Exception ex = Server.GetLastError().GetBaseException(); 
    this.lblMessage.Text = ex.Message; 
    this.lblSource.Text = ex.Source; 
    this.lblStackTrace.Text = ex.StackTrace; 
    if (AppProperties.AppEnv != AppEnvironment.PROD) 
    { 
     this.ErrorDetails.Visible = true; 
    } 
    else 
    { 
     this.ErrorDetails.Visible = false; 
    } 
    Utility.LogError(); 
    Server.ClearError(); 
} 

C'est ce que la fonction LogError ressemble ...

public static void LogError() 
{ 
    LogError(HttpContext.Current.Server.GetLastError().GetBaseException()); 
} 

public static void LogError(Exception ex) 
{ 
    EventLog log = new EventLog(); 
    if (ex != null) 
    { 
     log.Source = ConfigurationManager.AppSettings["EventLog"].ToString(); 
     StringBuilder sErrorMessage = new StringBuilder(); 
     if (HttpContext.Current.Request != null && HttpContext.Current.Request.Url != null) 
     { 
      sErrorMessage.Append(HttpContext.Current.Request.Url.ToString() + System.Environment.NewLine); 
     } 
     sErrorMessage.Append(ex.ToString()); 
     log.WriteEntry(sErrorMessage.ToString(), EventLogEntryType.Error); 
    } 
} 
+0

Devrais-je penser que AppProperties et AppEnvironment sont des classes statiques personnalisées? Merci pour vos réponses. – eKek0

+0

Oui, désolé ... AppProperties est une classe statique qui contient quelques éléments différents tels que mon environnement d'exploitation. Je montre/cache des informations basées sur l'environnement ... – RSolberg

0

Vous pouvez utiliser Server.GetLastError() pour obtenir l'exception levée par votre application.

0

Dans votre page, faire quelque chose comme ceci:

ErrorLabel.Text = Server.GetLastError(); 

Cela suppose C#. Vous pouvez ensuite rediriger depuis l'événement ApplicationError du fichier global.asax. Il existe d'autres façons de gérer cela, et je ne recommande pas d'utiliser le message d'exception pour montrer l'utilisateur.

1

Vous pouvez obtenir la dernière exception à Server.GetLastError(). Une fois l'erreur traitée, vous pouvez l'effacer si vous le souhaitez en appelant Server.ClearError(). Par ailleurs, il est considéré comme une mauvaise pratique de montrer trop à l'utilisateur final peut s'avérer une faille de sécurité. Aussi, soyez averti, si vous redirigez plutôt que de renvoyer un code d'erreur HTTP 500, divers robots ne se rendront pas compte qu'ils causent une panne et continueront à exécuter les mêmes demandes cassées sur votre site. Assurez-vous donc d'utiliser Server.Transfer() plutôt que Response.Redirect() et de définir Response.StatusCode = 500.

-1

Il est presque toujours une mauvaise idée de montrer des informations d'erreur détaillées aux utilisateurs finaux. Vous pourriez finir par exposer toutes sortes d'informations inappropriées: noms de fichiers, informations d'identification de base de données, détails d'implémentation, etc. Consigner l'exception dans un endroit sûr (fichier journal, base de données, etc.) mais ne pas le montrer à l'utilisateur.

Questions connexes