آموزش ASP.Net

آموزش ASP.Net - اداره خطا

مدیریت خطا در ASP.NET دارای سه جنبۀ متفاوت می باشد:

  • Tracing: قابلیت ثبت وقایع و اطلاعات مربوط به اجرای برنامه در سطح اپلیکیشن یا در سطح
  • Error handling: مدیریت خطاهای standard یا custom در سطح اپلیکیشن یا صفحه.
  • Debugging: اشکال زدایی که طی آن برنامه نویس مرحله به مرحله برنامه را بررسی کرده و با استفاده از breakpoint ها (نقطه ی انفصال) کد نوشته شده را تجزیه و تحلیل می کند

در مبحث پیش رو به تشریح هر سه جنبۀ نام برده خواهیم پرداخت.

جهت درک مفهوم، یک اپلیکیشن آزمایشی می سازیم. اپلیکیشن مورد نظر دارای یک کنترل label، یک کنترل dropdown list (فهرست کشویی) و یک لینک می باشد.  dropdown list  یک لیست آرایه از quote ها را نمایش می دهد. Quote های انتخاب شده در کنترل label نشان داده می شوند. اپلکیشن مورد نظر همچنین دارای یک لینک می باشد که در صورت کلیک روی آن کاربر به سایت خاصی ارجاع داده نمی شود.

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" %>

<!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>
         Tracing, debugging and error handling
      </title>
   </head>
   
   <body>
      <form id="form1" runat="server">
      
         <div>
            <asp:Label ID="lblheading" runat="server" Text="Tracing, Debuggin  and Error Handling">
            </asp:Label>
            
            <br /> <br />
            
            <asp:DropDownList ID="ddlquotes" runat="server" AutoPostBack="True"  onselectedindexchanged="ddlquotes_SelectedIndexChanged">
            </asp:DropDownList>
            
            <br /> <br />
            
            <asp:Label ID="lblquotes" runat="server">
            </asp:Label>
            
            <br /> <br />
            
            <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="mylink.htm">Link to:</asp:HyperLink>
         </div>
         
      </form>
   </body>
   
</html>

فایل code behind:

public partial class _Default : System.Web.UI.Page
{
   protected void Page_Load(object sender, EventArgs e)
   {
      if (!IsPostBack)
      {
         string[,] quotes = 
         {
            {"Imagination is more important than Knowledge.", "Albert Einsten"},
            {"Assume a virtue, if you have it not" "Shakespeare"},
            {"A man cannot be comfortable without his own approval", "Mark Twain"},
            {"Beware the young doctor and the old barber", "Benjamin Franklin"},
            {"Whatever begun in anger ends in shame", "Benjamin Franklin"}
         };
         
         for (int i=0; i<quotes.GetLength(0); i++)
            ddlquotes.Items.Add(new ListItem(quotes[i,0], quotes[i,1]));
      }
   }
   
   protected void ddlquotes_SelectedIndexChanged(object sender, EventArgs e)
   {
      if (ddlquotes.SelectedIndex != -1)
      {
         lblquotes.Text = String.Format("{0}, Quote: {1}", ddlquotes.SelectedItem.Text, ddlquotes.SelectedValue);
      }
   }
}

Tracing

به منظور ایجاد امکان tracing در سطح page، لازم است Page directive را اصلاح کرده و یک خصیصه ی Trace به آن اضافه کنید:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   Inherits="errorhandling._Default" Trace ="true" %>

پس از اجرای فایل، اطلاعات مربوط به tracing (ردگیری و ثبت اطلاعات مربوط به اجرای برنامه) در اختیار شما قرار داده می شود:

tracing info

اطلاعات زیر را ارائه می دهد:

  • Session ID  (شناسۀ  session)
  • Status Code (کد وضعیت(
  • Time of Request (زمان درخواست)
  • Type of Request (نوع درخواست)
  • Request and Response Encoding (رمز گذاری درخواست و پاسخ)

Status code ای که با هر بار درخواست صفحه (page request) از سمت سرور ارسال می گردد، اسم خطا و زمان رخداد آن را نشان می دهد. جدول زیر status code های متداول HTTP را در اختیار شما قرار می دهد:

شرح

عدد

Informational (100 - 199)

ادامه دهید (Continue)

100

پروتکل ها را عوض کنید (Switching protocols)

101

Successful (200 - 299)

ok

200

بدون محتوا (No content)

204

Redirection (300 - 399)

به طور دائمی منتقل شد (Moved permanently)

301

از پروکسی استفاده کنید (Use proxy)

305

تغییر مسیر موقت (Temporary redirect)

307

Client Errors (400 - 499)

درخواست نا مناسب (Bad request)

400

مستلزم پرداخت (Payment required)

402

یافت نشد (Not found)

404

زمان درخواست اتمام یافته است (Request timeout)

408

عدم موفقیت Expectation

417

Server Errors (500 - 599)

خطای سرور داخلی (Internal server error)

500

سرویس در دسترس نیست (Service unavailable)

503

نسخه HTTP پشتیبانی نمی شود (HTTP version not supported)

505

 

زیر بخش اطلاعات سطح بالا (top level info)، با یک Trace log (فایل ثبت وقایع و اطالاعات مر بوط به اجرای برنامه) مواجه می شویم که اطلاعاتی را دربارۀ چرخۀ حیات (life cycle) صفحه در اختیار ما قرار می دهد. Trace log همچنین مدت زمان سپری شده از زمان مقداردهی اولیۀ صفحه را بر حسب ثانیه در اختیار ما قرار می دهد.

tracing info 2

بخش بعدی control tree می باشد که کلیه کنترل های موجود در صفحه را به صورت سلسله مراتبی فهرست می کند:

tracing info3

در پایان خلاصه یا چکیده ای از وضعیت های Application و Session، همچنین cookie ها و header ها (سرآیند) و به دنبال آن فهرستی از متغیرهای server را داریم.

شئ Trace به برنامه نویس امکان می دهد اطلاعات سفارشی یا custom به خروجی trace بیافزاید. شئ مذکور برای این منظور دو متد Write و Warn را ارائه می دهد.

Event handler  (مدیریت کنندۀ رخداد) Page_Load را برای چک کردن متد Write اصلاح کنید:

protected void Page_Load(object sender, EventArgs e)
{
   Trace.Write("Page Load");
   
   if (!IsPostBack)
   {
      Trace.Write("Not Post Back, Page Load");
      string[,] quotes = 
      .......................
   }
}

حال کد را اجرا کرده تا نتیجۀ آن را مشاهده کنید:

tracing info4

برای چک کردن متد Warn، تعدادی کد نادرست را به طور عمد در اندیس انتخابی event handler اصلاح شده وارد می کنیم:

try
{
   int a = 0;
   int b = 9 / a;
}catch (Exception e)
{
   Trace.Warn("UserAction", "processing 9/a", e);
}

Try-Catch  در واقع یک سازه ی برنامه نویسی برگرفته از زبان C# است. بلوک try کدهایی را دربرمی گیرد که ممکن است باعث ایجاد خطا (error) شوند و بلوک catch نیز خطا را گرفته و ضبط می کند. پس از اجرای برنامه، هشدار به داخل trace log فرستاده شده و نمایش داده می شود.

tracing info5

Tracing  در سطح اپلیکیشن در واقع به تمامی صفحات موجود در وب سایت اعمال می شود. tracing  در سطح اپلیکیشن با وارد کردن خط های کد زیر در فایل web.config پیاده سازی می شود:

<system.web>
   <trace enabled="true" />
</system.web>

 

Error Handling  (مدیریت خطا)

اگرچه خود تکنولوژی ASP.NET قادر به پیدا کردن خطاهای زمان اجرا (runtime error) می باشد، با این وجود ممکن است تعدادی خطای جزئی از دید آن پنهان بماند. پیدا کردن و نظارت بر خطاها در واقع کار برنامه نویسان است و نه کاربرها.

 از این رو به منظور جلوگیری از وقوع چنین رخدادهایی می توان تنظیماتی مبنی بر مدیریت خطا (error handling settings) به فایل web.config اضافه کنید. برای مثال در صورتی که قرار است مدیریت خطا در کل برنامه اجرا شود، کافی است کدهای زیر را به فایل web.config خود اضافه کنید:

<configuration>
   <system.web>
   
      <customErrors mode="RemoteOnly" defaultRedirect="GenericErrorPage.htm">
         <error statusCode="403" redirect="NoAccess.htm" />
         <error statusCode="404" redirect="FileNotFound.htm" />
      </customErrors>
      
   </system.web>
<configuration>

بخش < customErrors > دارای خصیصه های ممکن زیر می باشد:

  • custom error page :mode (صفحات خطا customize شده) را فعال یا غیر فعال می کند.
    • On: در این حالت صفحات سفارشی (custom) نمایش داده می شوند.
    • Off : صفحات خطای پیش فرضNET را نمایش می دهد (صفحات زرد رنگ)
    • RemoteOnly : خطاهای سفارشی را به کلاینت نشان داده و خطاهایNET را به صورت محلی را نمایش می دهد.
  • defaultRedirect : دربرداندره ی URLصفحه ای است که در صورت برخورد با خطاهای مدیریت نشده (unhandled error) نمایش داده می شود.

به منظور قرار دادن صفحات خطای customized شده برای انواع مختلف خطا، از subTag های < error >  بهره می گیریم که در آن انواع مختلف صفحات خطا بر اساس کد وضعیت (status code) خطاها مشخص می شود.

به منظور پیاده سازی مدیریت خطا که در سطح صفحه اجرا می شود (page level error handling)، باید page directive را اصلاح کرد:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs"
   Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>

به این دلیل که اشکال زدایی در ASP.NET به تنهایی یک موضوع مهم تلقی می شود در فصل بعد به صورت جداگانه مورد بحث قرار می گیرد.

در صورتی که سوال و یا نظری دارید، از بخش نظرات با ما در میان بگذارید.

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

شما چه نظر و یا سوالی درباره این نوشته دارید؟

مبحث آموزشی

آموزش ASP.Net

Learn ASP.Net

سرفصل ها

پرســیدن سؤال جدید

سؤال های تخصصی خود را از ما بپرسید

دنبال کردن تلگرام کانال سافت اسکیل

https://telegram.me/softskill_ir

عملیات کاربران

خبـرنــامه

Newsletters

در خبــرنـامه سافت اسکیل عضو شویــد تا جدیدترین هـای سایت را بلافاصله در ایمیل خـود دریافت کنیـد

کلیک کنید و سوالات خود را از ما بپرسید
لطفا فرم سوال را پر کنید

سوال شما با موفقیت ثبت شد. برای اینکه بتوانیم به شما اطلاع رسانی کنیم، موارد زیر را وارد کنید:

لطفا چند لحظه منتظر بمانید ...