ASP.NET Tutorial/Development/Exception

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Application-level error handling

Protected Sub Application_Error(sender as Object, ByVal e As System.EventArgs)
    Dim bigError As System.Exception = Server.GetLastError()
    If (TypeOf AnError.GetBaseException() Is HttpRequestValidationException) Then
        System.Diagnostics.Trace.WriteLine(bigError.ToString)
        Server.ClearError()
    End If
End Sub


Catch exception and display exception message, Source and StackTrace (C#)

File: Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="ErrorHandlingTest" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="Label1" runat="server" Text="A:"></asp:Label>
        <asp:TextBox ID="txtA" runat="server">5</asp:TextBox><br />
        <asp:Label ID="Label2" runat="server" Text="B:"></asp:Label>
        <asp:TextBox ID="txtB" runat="server">0</asp:TextBox><br />
        <br />
        <asp:Button ID="cmdCompute" runat="server" OnClick="cmdCompute_Click" Text="Divide A / B" /><br />
        <br />
        <br />
        <asp:Label ID="lblResult" runat="server" Font-Bold="True" ForeColor="Red"></asp:Label></div>
    </form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing;
public partial class ErrorHandlingTest : System.Web.UI.Page
{
    protected void cmdCompute_Click(object sender, EventArgs e)
    {
        try
        {
            decimal a, b, result;
            a = Decimal.Parse(txtA.Text);
            b = Decimal.Parse(txtB.Text);
            result = a / b;
            lblResult.Text = result.ToString();
            lblResult.ForeColor = Color.Black;
        }
        catch (Exception err)
        {
            lblResult.Text = "<b>Message:</b> " + err.Message;
            lblResult.Text += "<br /><br />";
            lblResult.Text += "<b>Source:</b> " + err.Source;
            lblResult.Text += "<br /><br />";
            lblResult.Text += "<b>Stack Trace:</b> " + err.StackTrace;
            lblResult.ForeColor = Color.Red;
        }
    }
}


Divide By Zero With Exception

<script language="C#" runat="server">
protected void Page_Load(object o, EventArgs e) {
    try {
        int x;
        int y;
        x = 5;
        y = 0;
        int result = x / y;
        string message = "result is: " + result;
        Response.Write(message);
    }
    catch(DivideByZeroException) {
        Response.Write("divisor can"t be zero");
    }
}
</script>


Generic error handler page

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 
    Inherits="Samples_GenericError" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Unrecoverable Error</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
       <table>
        <tr>
            <td>
                An <strong>unrecoverable</strong> error occurred and we"re still investigating the
                reasons.<br />
                <b>Error code:&nbsp;</b><span runat="server" id="ErrorCode"></span><br />
                <b>Error path:&nbsp;</b><span runat="server" id="Referrer"></span>
            </td>
        </tr>
        </table>
    </div>
    </form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
public partial class Samples_GenericError : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string errCode = "<i>No error information available.</i>";
        object o = Request.QueryString["ErrID"];
        if (o != null)
             errCode = (string) o;
         ErrorCode.InnerHtml = errCode;
        string referrer = "<i>Error path not available.</i>"; 
        string temp = Request.UrlReferrer.ToString();
        if (!String.IsNullOrEmpty(temp))
            referrer = temp;
        Referrer.InnerHtml = referrer;
    }
}


Page-level error handling

Protected Overrides Sub OnError(ByVal e As System.EventArgs)
    Dim AnError As System.Exception = Server.GetLastError()
    If (TypeOf AnError.GetBaseException() Is SomeSpecificException) Then
        Response.Write("Something bad happened!")
        Response.StatusCode = 200
        Server.ClearError()
        Response.End()
    End If
End Sub


Transfer to different page based on exception type

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" 
    Inherits="Default"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Exceptions at work</title>
</head>
<body>
    To test this page effectively, first disable the customErrors section in the web.config file and 
                then try again with the section enabled.
    <div id="pageContent">
        <form id="form1" runat="server">
            <ul><li>
            <asp:LinkButton ID="LinkButton1" runat="server" OnClick="LinkButton1_Click">Click to throw a NotImplementedException exception</asp:LinkButton> 
            </li><li>
            <asp:LinkButton ID="LinkButton2" runat="server" OnClick="LinkButton2_Click">Click to generate an internal error</asp:LinkButton></li>
                <li>
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="missing.aspx">Click to raise a HTTP 404 error</asp:HyperLink></li>
            </ul>
        </form>
    </div>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default : System.Web.UI.Page
{
    protected void Page_Error(object sender, EventArgs e)
    {
        Exception ex = Server.GetLastError();
        if (ex is NotImplementedException)
            Server.Transfer("/notimplementedexception.aspx");
        else
            Server.Transfer("/apperror.aspx");
        Server.ClearError();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
    }
  protected void LinkButton1_Click(object sender, EventArgs e)
  {
    throw new NotImplementedException("The feature you requested is not implemented yet.");
  }
  protected void LinkButton2_Click(object sender, EventArgs e)
  {
        string test = null;
        Response.Write(test.ToString());
  }
}


Try to catch error when converting text value to number

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="TryCatch" %>
<!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>Try...Catch Example</title>
</head>
<body>
   <form id="form1" runat="server">
   <div id="container">
   <h1>Simple Calculator</h1>
   <div class="box">
      <asp:TextBox ID="txtValue" runat="server" />
      <br />
      <asp:Button Text="Do Math" runat="server" ID="btnDivide" 
         OnClick="btnDivide_Click" />
   </div>
   <asp:Label ID="labMessage" runat="server" />
   </div>
   </form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class TryCatch : System.Web.UI.Page
{
   protected void btnDivide_Click(object sender, EventArgs e)
   {
        try
        {
           double dVal = Convert.ToDouble(txtValue.Text);
           double result = dVal * 100.0;
        
           labMessage.Text = txtValue.Text + "* 100.0";
           labMessage.Text += "=" + result;
        }
        catch (FormatException ex1)
        {
           labMessage.Text = "Please enter a valid number";
        }
        catch (Exception ex2)
        {
           labMessage.Text = "Unable to compute a value with these values";
        }
   }
}


Use Global.asax to log application level exception

<%@ Application Language="C#" %>
<%@ Import Namespace="System.Diagnostics" %> 
<%@ Import Namespace="System.Text" %>
<script runat="server">
    void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
    }
    
    void Application_End(object sender, EventArgs e) 
    {
        //  Code that runs on application shutdown
    }
        
    void Application_Error(object sender, EventArgs e) 
    {
        // Obtain the URL of the request 
        string url = Request.Path;
        // Obtain the Exception object describing the error 
        Exception error = Server.GetLastError();
        // Build the message --> [Error occurred. XXX at url]
        StringBuilder text = new StringBuilder("Error occurred. ");
        text.Append(error.Message);
        text.Append(" at ");
        text.Append(url); 
        // Write to the Event Log 
        EventLog log = new EventLog();
        log.Source = "Core35 Log";
       // log.WriteEntry(text.ToString(), EventLogEntryType.Error);
    }
</script>


What is going to happen if there is no exception handler

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="DivideByZero_aspx" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    </form>
</body>
</html>
File: Default.aspx.cs
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
public partial class DivideByZero_aspx : System.Web.UI.Page
{  
    protected void Page_Load(object sender, EventArgs e)
    {
        int i = 0;
        int j = 1;
        int k = j/i;
    }
}