ASP.NET - مدیریت خطا

مدیریت خطا در ASP.NET سه جنبه دارد:ردیابی - ردیابی اجرای برنامه در سطح صفحه یا سطح برنامه.مدیریت خطا - رسیدگی به خطاهای استاندارد یا خطاهای سفارشی در سطح صفحه یا سطح برنامه.اشکال زدایی - گام برداشتن در برنامه، تنظیم نقاط شکست برای تجزیه و تحلیل کددر این فصل به ردیابی و رسیدگی به خطا می پردازیم و در این فصل به رفع اشکال می پردازیم.برای درک مفاهیم، نمونه برنامه زیر را ایجاد کنید. دارای یک کنترل برچسب، یک لیست کشویی و یک پیوند است. لیست کشویی فهرست آرایه ای از نقل قول های معروف را بارگیری می کند و نقل قول انتخاب شده در برچسب زیر نشان داده شده است. همچنین دارای یک هایپرلینک است که دارای نقاطی به یک پیوند ناموجود است.<%@ 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>کد پشت فایل: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); } }}ردیابیبرای فعال کردن ردیابی سطح صفحه، باید دستورالعمل Page را تغییر دهید و یک ویژگی Trace را مانند شکل اضافه کنید:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" %>حالا وقتی فایل را اجرا می کنید، اطلاعات ردیابی را دریافت می کنید:این اطلاعات زیر را در بالا ارائه می دهد:شناسه جلسهکد وضعیتزمان درخواستنوع درخواسترمزگذاری درخواست و پاسخکد وضعیت ارسال شده از سرور، هر بار که صفحه درخواست می شود، نام و زمان خطا را در صورت وجود نشان می دهد. جدول زیر کدهای وضعیت رایج HTTP را نشان می دهد:توضیحات شمارهاطلاعاتی (100 - 199)100 ادامه101 پروتکل های سوئیچینگموفق (200 - 299)200 باشه204 بدون محتواتغییر مسیر (300 - 399)301 به طور دائم منتقل شد305 از پروکسی استفاده کنید307 تغییر مسیر موقتخطاهای مشتری (400 - 499)400 درخواست بد402 پرداخت مورد نیاز است404 پیدا نشد408 درخواست مهلت زمانی417 انتظار شکست خوردخطاهای سرور (500 - 599)500 خطای سرور داخلی503 خدمات در دسترس نیستنسخه 505 HTTP پشتیبانی نمی شوددر زیر اطلاعات سطح بالا، Trace log وجود دارد که جزئیات چرخه عمر صفحه را ارائه می دهد. زمان سپری شده از زمان اولیه سازی صفحه را در چند ثانیه ارائه می کند.بخش بعدی درخت کنترل است که تمام کنترل های صفحه را به صورت سلسله مراتبی فهرست می کند:آخرین در مجموعه‌های خلاصه، کوکی‌ها و سرصفحه‌های حالت جلسه و برنامه و به دنبال آن فهرستی از همه متغیرهای سرور.شی Trace به شما امکان می دهد اطلاعات سفارشی را به خروجی ردیابی اضافه کنید. برای انجام این کار دو روش دارد: روش Write و متد Warn.کنترل کننده رویداد 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 = ....................... }}برای مشاهده اثرات بدوید:برای بررسی روش اخطار، اجازه دهید به زور مقداری کد اشتباه را در کنترل کننده رویداد انتخابی تغییر یافته ایندکس وارد کنیم:try{ int a = 0; int b = 9 / a;}catch (Exception e){ Trace.Warn("UserAction", "processing 9/a", e);}Try-Catch یک ساختار برنامه نویسی C# است. بلوک try هر کدی را که ممکن است خطا ایجاد کند یا نکند را در خود نگه می دارد و بلوک catch خطا را دریافت می کند. هنگامی که برنامه اجرا می شود، هشدار را در گزارش ردیابی ارسال می کند.ردیابی سطح برنامه برای تمام صفحات وب سایت اعمال می شود. با قرار دادن خطوط کد زیر در فایل web.config پیاده سازی می شود:<system.web> <trace enabled="true" /></system.web>رسیدگی به خطااگرچه ASP.NET می تواند تمام خطاهای زمان اجرا را شناسایی کند، هنوز هم ممکن است برخی از خطاهای ظریف هنوز وجود داشته باشد. مشاهده خطاها با ردیابی برای توسعه دهندگان است نه برای کاربران.از این رو، برای رهگیری چنین اتفاقی، می توانید تنظیمات انتقال خطا را در فایل 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> دارای ویژگی های ممکن است:حالت: صفحات خطای سفارشی را فعال یا غیرفعال می کند. دارای سه مقدار ممکن است:روشن: صفحات سفارشی را نمایش می دهد.خاموش: صفحات خطای ASP.NET را نمایش می دهد (صفحات زرد)remoteOnly : خطاهای سفارشی را به مشتری نمایش می دهد، خطاهای ASP.NET را به صورت محلی نمایش می دهد.defaultRedirect : حاوی URL صفحه ای است که در صورت بروز خطاهای کنترل نشده نمایش داده می شود.برای قرار دادن صفحات خطای سفارشی مختلف برای انواع مختلف خطاها، از تگ های فرعی <error> استفاده می شود که در آن صفحات خطای مختلف بر اساس کد وضعیت خطاها مشخص می شود.برای پیاده سازی مدیریت خطا در سطح صفحه، دستورالعمل Page را می توان اصلاح کرد:<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="errorhandling._Default" Trace ="true" ErrorPage="PageError.htm" %>از آنجا که اشکال زدایی ASP.NET به خودی خود موضوع مهمی است، بنابراین در فصل بعدی به طور جداگانه به آن خواهیم پرداخت.