Error Handling در ASP.NET

خطاء‌ و يا Error از جمله واژه های معروف در ادبيات برنامه نويسی است كه هر برنامه نويس صرفنظر از ميزان مهارت خود با آن مواجه خواهد شد . پياده كنندگان برنامه های وب نيز از اين قاعده مستثنی نبوده و ممكن است در زمان پياده سازی اين نوع برنامه ها با مجموعه ای از خطاها برخورد نمايند . علاقه مندانی كه پلت فرم مايكروسافت را برای طراحی و پياده سازی برنامه های وب انتخاب نموده اند ( ASP.NET ) ،‌ می توانند با استفاده از امكانات موجود با خطاها برخورد و آنان را مديريت نمايند .
پس از بروز خطاء در يك صفحه ، ASP.NET اطلاعات مربوط به خطاء را برای سرويس گيرنده ارسال می نمايد . يك صفحه وب ASP.NET ممكن است در زمان اجراء به يكی از خطاهای زير برخورد نمايد :
• خطاهای پيكربندی : زمانی كه گرامر و يا ساختار فايل web.config نادرست باشد ، ايجاد می گردند .
• خطاهای پارسر : زمانی كه گرامر ASP.NET بر روی يك صفحه نادرست باشد ، ايجاد می گردند .
• خطاهای ترجمه : زمانی كه عبارات و دستورات نوشته شده در صفحات متناسب با گرامر زبان استفاده شده نباشند ،‌ ايجاد می گردند .
• خطاهای زمان اجراء : در زمان اجرای يك صفحه ايجاد می گردند .
پس از بروز يك خطاء‌ ،‌ به صورت پيش فرض اطلاعات موجود در Stack كه حاوی فراخوانی ترتيبی مجموعه ای از روتين ها است ، نمايش داده می شود . در صورتی كه debug mode فعال شده باشد ،‌ ASP.NET شماره خط بروز خطاء در كد منبع را كه باعث بروز خطاء ‌شده است را نمايش خواهد داد . debug mode يك ابزار ارزشمند برای اشكال زدائی برنامه ها می‌باشد .
فعال كردن debug mode در سطح page : بدين منظور از دايركتيو زير استفاده می گردد :

<%@ Page Debug="true" %>


فعال كردن debug mode در سطح Application : بدين منظور از فايل Web.config موجود در فهرست ريشه application استفاده می گردد :

<configuration>
  <system.web>
     <compilation debug="true"/>
  </system.web>
</configuration>


اثرات جانبی فعال كردن debug mode

فعال كردن debug mode كارآئی سيستم را كاهش و افزايش حجم عمليات سيستم را به دنبال خواهد داشت ، بنابراين لازم است پس از اتمام فرآيند پياده سازی نرم افزار و نصب در محيط عملياتی ، آن را غيرفعال نمود . پس از فعال شدن debug mode در صورت بروز خطاء‌ ، شماره خط به همراه جزئيات مربوطه نمايش داده می شود .

سفارشی كردن صفحات خطاء

برای برخورد با خطاء از روش های متفاوتی استفاده می گردد. مثلا" در زمان پياده سازی لازم است جزئيات مربوط به خطاء نمايش داده شود تا بتوان اشكالات موجود را سريعا" تشخيص و برطرف نمود . بديهی است پس از آماده شدن برنامه و نصب در محيط عملياتی ،‌ضرورتی به نمايش جزئيات خطاء وجود نخواهد داشت . در چنين مواردی می توان با استفاده از امكانات موجود تمهيداتی را اتخاذ نمود كه محل بروز خطاء به سرويس گيرندگان محلی ، راه دور و يا هر دو نمايش داده شود . در زمان بروز خطاء به صورت پيش فرض، اطلاعات مربوط به خطای ايجاد شده صرفا" برای سرويس گيرندگان محلی ( سرويس گيرندگانی كه برنامه را مستقيما" از طريق كامپيوتر سرويس دهنده اجراء می نمايند ) ،‌ نمايش داده می شود . در چنين مواردی می توان يك صفحه خطاء سفارشی را ايجاد تا در صورت بروز خطاء ، سرويس گيرندگان به آن صفحه هدايت گردند .
برای فعال كردن خطاهای سفارشی از امكانات موجود در فايل Web.Config استفاده می گردد . كد زير نحوه انجام اين كار را نشان می دهد :

Web.Config

<configuration>
   <system.web>
       <customErrors defaultRedirect="DefaultErrorPage.htm"  mode="RemoteOnly" />
  </system.web>
</configuration>


پيكربندی فوق باعث نمايش جزئيات خطاء برای سرويس گيرندگان محلی می گردد ولی سرويس گيرندگان از راه دور به يك صفحه خطاء سفارشی هدايت خواهند شد ( DefaultErrorPage.htm ) . صفحه فوق می‌ تواند يك صفحه aspx . نيز باشد .
ASP.NET مسير صفحه ای‌ را كه باعث بروز خطاء‌ شده است را به عنوان يك آرگومان QueryString برای صفحه خطاء ارسال می نمايد(ErrorPage ). در صورتی كه صفحه سفارشی خطاء‌ خود دارای يك خطاء‌ باشد ، يك صفحه خالی برای سرويس گيرندگان از راه دور ارسال می گردد .

DefaultErrorPage.htm

<%@ Page Language="VB" Description="Error page"%>
  <html>
    <head>
     <title>صفحه خطاء</title>
</head>
 <body>
     بروز خطاء در صفحه: <%=Request.QueryString("ErrorPage") %>
 </body>
</html>

توجه داشته باشيد كه صرفا" فايل هائی كه به aspnet_isapi.dll در IIS نسبت و يا map شده اند، خطای فوق را توليد خواهند كرد و فايل هائی كه به aspnet_isapi.dll نسبت داده نشده اند ، توسط ASP.NET پردازش نشده و مسئوليت ارائه خطاء‌ برعهده IIS خواهد بود .
جدول زير خصلت های پيكربندی و مقادير مجاز برای تگ <customeErrors> را نشان می دهد :

خصلت

شرح

mode

فعال بودن ،‌ غير فعال بودن و يا نمايش صفحه سفارشی خطاء صرفا" برای كامپيوترهای راه  دور را مشخص می نمايد.
مقدار نسبت داده شده به خصلت فوق on , offو يا  reamoteOnlyمی باشد ( مقدار پيش فرض RemoteOnlyاست )

defaultRedirect

نام صفحه سفارشی خطاء را مشخص می نمايد .


با توجه به مقدار نسبت داده شده به خصلت Mode ، در خصوص نمايش خطاء برای سرويس گيرندگان راه دور ، محلی و يا هر دو تصميم گيری می شود . جدول زير مقادیر نسبت داده شده به خصلت Mode و تاثير آن بر روی درخواست های محلی و از راه دور را نشان می دهد .

Mode

درخواست های محلی

درخواست های از راه دور

On

نمايش صفحه سفارشی خطاء

نمايش صفحه سفارشیخطاء

Off

نمايش صفحه خطاء ASP.NET

نمايش صفحه خطاء ASP.NET

RemoteOnly

نمايش صفحه خطاء ASP.NET

نمايش صفحه سفارشیخطاء


مثال : نحوه استفاده از <customErrors>

• مرحله اول : پيكربندی لازم در فايل Web.Config

Web.Config

<configuration>
   <system.web>
      <customErrors defaultRedirect="DefaultErrorPage.htm"  mode="RemoteOnly" />
   </system.web>
</configuration>


• مرحله دوم : ايجاد صفحه سفارشی خطاء

DefaultErrorPage.htm

<html dir=rtl>
<head>
 <title>بروز اشكالدر برنامه</title>
</head>
<body >
<font face="Tahoma">
<h4>اشكال در صفحه درخواستی</h4>
<P Align="rtl" Dir="rtl">
در حال حاضر امكان پاسخ به درخواست شما وجود ندارد ،
لطفا" اشكال ايجاد شده را از طريق آدرس
 info@srco.ir
به اطلاع مديريتسايت سخاروش برسانيد.
<p>
</font>
</body>
</html>


پس از ايجاد مراحل فوق ، در صورت بروز خطاء ( عدم وجود فايل ، بروز اشكال بر روی سرويس دهنده و يا ساير خطاهای متداول در صفحه درخواستی ) ، فايل DefaultErrorPage.htm نمايش داده می شود .
صفحه سفارشی خطاء با نام DefaultErrorPage.htm كه در مثال قبل ايجاد شده بود برای تمامی موارد خطاء نمايش داده می شود . در صورت تمايل می توان برای هر نوع خطاء يك صفحه خاص را طراحی تا پس از بروز خطاء نمايش داده شود . بخش پيكربندی <customErrors> دارای يك تگ داخلی با نام <error> است كه مرتبط با كدهای وضعيت HTTP می باشد .

<configuration>
  <system.web>
    <customErrors mode="RemoteOnly" defaultRedirect="/DefaultErrorPage.htm">
        <error statusCode="500" redirect="/error/ServerError.htm"/>
          <error
statusCode="404" redirect="/error/Filenotfound.aspx"/>
          <error
statusCode="403" redirect="/error/Forbidden.aspx"/>
   </customErrors>
  </system.web>
</configuration>


جدول زير خصلت ها و مقادير مربوط به تگ <error> را نشان می دهد :

خصلت

شرح

StatusCode

 كد وضعيت خطاء HTTP  را كه می بايست توسط صفحه سفارشی خطاء استفاده گردد ، مشخص می نمايد .
مثلا" كد 403 مربوط به خطاء Forbidden، كد 404 برای مواردی كه فايل درخواستی موجود نباشد و يا كد خطاء 500 برای مواردی كه خطاء در ارتباط با سرويس دهنده باشد .

Redirect

 آدرس و نام صفحه سفارشی مرتبط با نوع خطاء را كه می بايست پس از بروز خطاء نمايش داده شود را مشخص می نمايد .  


مديريت خطاء‌ از طريق كد برنامه

با استفاده از امكانات موجود در ASP.NET می توان از طريق كد نوشته شده با خطاء برخورد نمود ( هم در سطح page و هم در سطح application ) .
• Page Level : كلاس پايه page دارای متدی با نام Page_Error است كه می توان آن را در صفحات استفاده نمود .

Page Level

<script language="VB runat="server">

Sub Page_Error(Source As Object, E As EventArgs)
 Dim message As String = "<font face=Tahoma color=red>" _
 & "<h4>" & Request.Url.ToString() & "</h4>" _
 & "<pre><font color='red'>" _
 & Server.GetLastError().ToString() & "</pre>" _
 & "</font>"
 Response.Write(message)
End Sub

</script>

• Application Level : از رويداد Application_Error در فايل Global.aspx استفاده می گردد . پس از بروز هر نوع خطای غيرقابل پيش بينی رويداد فوق فعال می گردد.

Application Level

Sub Application_Error(sender As Object, e As EventArgs)
'...عمليات مورد نظر 
End Sub