خطا و یا 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 خواهد بود .
با توجه به مقدار نسبت داده شده به خصلت Mode ، در خصوص نمایش خطا برای سرویس گیرندگان راه دور ، محلی و یا هر دو تصمیم گیری می شود . جدول زیر مقادیر نسبت داده شده به خصلت Mode و تاثیر آن بر روی درخواست های محلی و از راه دور را نشان می دهد .
Mode درخواست های محلی درخواست های از راه دور
On نمایش صفحه سفارشی خطا
Off نمایش صفحه خطا ASP.NET
RemoteOnly نمایش صفحه خطا ASP.NET نمایش صفحه سفارشی خطا
مثال : نحوه استفاده از
▪ مرحله اول : پیكربندی لازم در فایل 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">
<h۴>اشكال در صفحه درخواستی </h۴>
<P Align="rtl" Dir="rtl">
در حال حاضر امكان پاسخ به درخواست شما وجود ندارد ،
لطفا اشكال ایجاد شده را از طریق آدرس
info@test.ir به اطلاع مدیریت سایت برسانید .
</p>
</font>
</body>
</html>
پس از ایجاد مراحل فوق ، در صورت بروز خطا ( عدم وجود فایل ، بروز اشكال بر روی سرویس دهنده و یا سایر خطاهای متداول در صفحه درخواستی ) ، فایل DefaultErrorPage.htm نمایش داده می شود .
صفحه سفارشی خطا با نام DefaultErrorPage.htm كه در مثال قبل ایجاد شده بود برای تمامی موارد خطا نمایش داده می شود . در صورت تمایل می توان برای هر نوع خطا یك صفحه خاص را طراحی تا پس از بروز خطا نمایش داده شود . بخش پیكربندی دارای یك تگ داخلی با نام است كه مرتبط با كدهای وضعیت HTTP می باشد .
<configuration>
<system.web>
<customErrors mode="RemoteOnly" defaultRedirect="/DefaultErrorPage.htm">
<error statusCode="۵۰۰" redirect="/error/ServerError.htm"/>
<error statusCode="۴۰۴" redirect="/error/Filenotfound.aspx"/>
<error statusCode="۴۰۳" redirect="/error/Forbidden.aspx"/>
</customErrors>
</system.web>
</configuration>
مدیریت خطا از طریق كد برنامه
با استفاده از امكانات موجود در 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>" _
& "<h۴>" & Request.Url.ToString() & "</h۴>" _
& "<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