TAHA
09-30-2009, 06:03 AM
خطاء و یا 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
>
مرحله دوم : ایجاد صفحه سفارشی خطاء
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 نمایش داده می شود .
http://www.srco.ir/Articles/images/ErrorHandling1.jpg
صفحه سفارشی خطاء با نام 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
پس از بروز خطاء در یک صفحه ، 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
>
مرحله دوم : ایجاد صفحه سفارشی خطاء
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 نمایش داده می شود .
http://www.srco.ir/Articles/images/ErrorHandling1.jpg
صفحه سفارشی خطاء با نام 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