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
}

Try-catch

programming/csharp/exceptionhandling.txt · Last modified: 2018-06-21 19:48 (external edit)
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0