Table of Contents
C# ASP.NET Exception handling
Ošetření vyjímek na úrovni aplikace
Pokud chceme, aby se uživateli neobjevila standardní hlaska Unhandled exception, nastavíme přesměrování na naší vlastní error stránku.
web.config
<customErrors mode="RemoteOnly" defaultRedirect="~/ErrorPage.aspx"> <error statusCode="404" redirect="404.html"/> <error statusCode="500" redirect="500.html"/> </customErrors>
Pokud chceme uživateli zobrazit více informací o vyjímce, která nastala, můžeme využít handler a chybovou stránku generovat dynamicky.
Neošetřenou vyjímku odchytíme v Global.asax a předáme naší stránce pro jejich obsluhu. Pokud nemáme nějakou mezi-vrstvu pro uložení vyjímky, použijeme session. Zároveň zde vyjímku můžeme ukládat do logu atd…
protected void Application_Error(object sender, EventArgs e) { // Get the exception Exception ex = Server.GetLastError().GetBaseException(); // Log the error log_Error.Error(ex.Message,ex); Session["LastException"] = ex; // Get Error page from web.config Configuration configuration = WebConfigurationManager.OpenWebConfiguration("~"); CustomErrorsSection customErrorsSection = (CustomErrorsSection)configuration.GetSection("system.web/customErrors"); // Redirect to Error page Server.Transfer(customErrorsSection.DefaultRedirect); // Clears the last thrown exception Server.ClearError(); }
Příklad jak může vypadat ErrorPage zobrazující neošetřenou vyjímku uživateli.
Code behind
public partial class ErrorPage : System.Web.UI.Page { protected void Page_PreLoad(object sender, EventArgs e) { lblDateTime.Text = String.Format("{0:u}", DateTime.Now); // Page where the exception was thrown hplBack.NavigateUrl = Request.QueryString["aspxerrorpath"]; if (Session["LastException"] != null) { Exception ex = (Exception)Session["LastException"]; lblExMessage.Text =ex.Message; lblExSource.Text = ex.Source; } } } }
aspx Page
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ErrorPage.aspx.cs" Inherits="MyWeb.ErrorPage" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title>Application Error</title> <link href="MessageBoxes.css" rel="stylesheet" type="text/css" /> <style type="text/css"> body { font-family:Arial, Helvetica, sans-serif; font-size:13px; } </style> </head> <body> <form id="form1" runat="server"> <h1>Error occurred!</h1> <div style="margin: 0 15 0 15 0; padding: 0 15 0 15;"> <asp:Label ID="lblDateTime" runat="server" Text="" CssClass="dateTime"></asp:Label><br /> <p>Your request couldnt be processed. Click <asp:HyperLink ID="hplBack" runat="server">here</asp:HyperLink> to go back and try the operation again. </p> <div class="error"> <b>Message:</b> <asp:Label ID="lblExMessage" runat="server" Text=""></asp:Label> <br /> <b>Source:</b> <asp:Label ID="lblExSource" runat="server" Text=""></asp:Label> <br /> </div> <div class="info">If the error persists, please contact server administrator.<br /> You can see the error details in error.log.</div> </div> </form> </body> </html>
Ošetření vyjímek na úrovni stránky
Pokud se rozhodneme ošetřit vyjímku na úrovni stránky, postupujeme stejně jako v Global.asax, využíváme ale handler dané stránky. Vyjimku pak můžeme zpracovat dle svých představ.
Code behind
protected void Page_Error(Object sender, EventArgs e) { Exception ex = Server.GetLastError().GetBaseException(); // do something with exception // Log exception // Redirect }