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