بررسی خطاها در ASP.NET - قسمت دوم
انتشار از مركز آموزش فارسي ، دانشنامه سوران
هنگامی که در یک صفحه ASP.NET خطایی رخ می دهد، ASP.NET اطلاعاتی راجع به خطا به Client می فرستد. در این مقاله به بررسی سفارشی کردن صفحات خطا، بررسی خطاها بوسیله برنامه نویسی و نوشتن خطاها در Event Log می پردازیم.
انتشار از مركز آموزش فارسي ، دانشنامه سوران
هنگامی که در یک صفحه ASP.NET خطایی رخ می دهد، ASP.NET اطلاعاتی راجع به خطا به Client می فرستد. در این مقاله به بررسی سفارشی کردن صفحات خطا، بررسی خطاها بوسیله برنامه نویسی و نوشتن خطاها در Event Log می پردازیم.
بررسی خطاها بوسیله برنامه نویسی
خطاها را میتوان در هر دو سطح صفحه و برنامه توسط کد راه اندازی کرد. کلاس پایه Page دارای متد Page_Error است، که میتوان از خاصیت override آن در صفحات خود بهره برد. این متد هر زمان که اتفاق بی دلیلی در زمان اجرا رخ دهد، فراخوانی می شود.
<script language="C#" runat="server">
void Page_Error(Object source, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>"
+ Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
</script>
مثال زیر متدPage_Error را نشان میدهد.
[error2.aspx]
<html>
<script language="C#" runat="server">
void Error_500(Object sender, EventArgs e) {
String foo = null;
Response.Write(foo.ToString());
}
void Page_Error(Object sender, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
Server.ClearError();
}
</script>
<body>
<form runat="server">
<h4><font face="verdana">Cause an Error to Occur...</font></h4>
<asp:button text="500 Server Error" OnClick="Error_500″ width="150″ runat="server"/><p>
</form>
</body>
</html>
می توان برخی اقدامات مفید ازقبیل ارسال یک ایمیل به مسئول سایت برای گفتن اینکه صفحه بدرستی اجرا نشده، انجام داد.ASP.NET مجموعه کلاسهایی در فضانام System.Web.Mail دقیقا به همین منظور داراست. برای فراخوانی این فضانام از دستور @Import در بالای صفحه خود به شکل زیر استفاده می کنیم:
<%@ Import Namespace="System.Web.Mail" %>
میتوان از اشیاء MailMessage و SmtpMail جهت ارسال برنامه وار ایمیل استفاده نمود.
MailMessage mail = new MailMessage();
mail.From = "automated@www.contoso.com";
mail.To = "administrator@www.contoso.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
مثال زیر نشان میدهد که چگونه ایمیلی در پاسخ به خطای صفحه ارسال می شود.
نکته: این مثال در حقیقت تا زمانی که سرویس Mail SMTP بر روی سیستم فعال نشده باشد، ایمیلی ارسال نمی کند. برای اطلاعات بیشتر در رابطه با سرویس Mail SMTP، در مستندات IIS جستجو شود.
[error3.aspx]
<%@ Import Namespace="System.Web.Mail" %>
<html>
<script language="VB" runat="server">
Sub Error_500(sender As Object, e As EventArgs)
Dim foo As String = Nothing
Response.Write(foo.ToString())
End Sub
Sub Page_Error(Sender As Object, E As EventArgs)
Dim message As String = "<font face=verdana color=red>" _
& "<h4>" & Request.Url.ToString() & "</h4>" _
& "<pre><font color=red>" & Server.GetLastError().ToString() & "</pre>" _
& "</font>"
Response.Write(message)
Response.Write("An error has occured on this server, and the administrator of the site has been notified.")
Dim mail As New MailMessage
mail.From = "automated@www.contoso.com"
mail.To = "administrator@www.contoso.com"
mail.Subject = "Site Error"
mail.Body = message
mail.BodyFormat = MailFormat.Html
SmtpMail.Send(mail)
Server.ClearError()
End Sub
</script>
<body>
<form runat="server">
<h4><font face="verdana">Cause an Error to Occur...</font></h4>
<asp:button text="500 Server Error" OnClick="Error_500″ width="150″ runat="server"/><p>
</form>
</body>
</html>
علاوه بر راه اندازی خطاها در سطح صفحه، ممکن است نیاز به بررسی خطاها در سطح برنامه باشد. به همین منظور، از رویداد Application_Error در Global.asax استفاده می شود. این رویداد برای هر پیشامد غیرمنتظره ای در برنامه اجرا می شود.
void Application_Error(Object sender, EventArgs e) {
//...Do something here
}
نوشتن در گزارش رویداد (Event Log)
فضانام System.Diagnostics کلاسهایی را جهت نوشتن گزارش رویداد ویندوز مهیا کرده است. برای استفاده از این فضانام در صفحات، در ابتدا باید فضانام به شکل زیر فراخوانی شود:
<%@ Import Namespace="System.Diagnostics"%>
کلاس EventLog گزارش را در خود ذخیره می کند. همچنین متدهای ایستایی برای بازیابی و یا ایجاد گزارش فراهم ساخته و می تواند جهت نوشتن گزارش ارسالی از طریق کد، معرفی شود. مثال زیر مراحل را طی متد Application_Error از Global.asax نشان می دهد. هرگاه وقفه غیرمنتظره ای در برنامه اتفاق بیافتد، یک ورودی شامل پیغام خطا و ردیابی پشته در گزارش برنامه ایجاد می شود.
void Application_Error(Object sender, EventArgs e) {
String Message = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create event Log if it does not exist
String LogName = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into event log
EventLog Log = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
کد کاملی برای مثال بالا در زیر موجود است. توجه شود که این کد به جهت جلوگیری از ورود به گزارش رویداد ویندوز سیستم شما غیرفعال شده و بنابراین نمی تواند اجرا شود. اگر مایل به مشاهده اجرای این کد باشید یک ریشه مجازی IIS که دربرگیرنده شاخه شامل این فایل است، ایجاد کنید.
[Global.asax]
<%@ Import Namespace="System.Diagnostics" %>
<script language="C#" runat="server">
void Application_Error(Object sender, EventArgs e) {
String Message = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create Event Log if it does not exist
String LogName = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into Event Log
EventLog Log = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
</script>
خلاصه
۱/ خطاها به چهار رسته تقسیم می شوند:خطاهای وضعیتی،خطاهای پارسر،خطاهای زمان کامپایل، و خطاهای زمان اجرا.
۲/ بطور پیش فرض، اطلاعاتی که برای خطای زمان اجرا نمایش داده می شوند،بصورت فراخوانی از پشته می باشد(زنجیره ای از فراخوانی های رویداد که وقفه را راه اندازی می کند). هنگامی که مد اشکالزدایی فعال باشد، ASP.NET شماره خطی از کد که خطای زمان اجرا در آن واقع شده نشان می دهد.
۳/ قابلیت تعیین نمایش یا عدم نمایش خطاها به clientهای محلی، clientهای راه دور و یا هر دو در ASP.NET وجود دارد. بطور پیش فرض، خطاها فقط برای clientهای محلی (clientهای موجود در همان کامپیوتر سرور ) نمایش داده می شوند. همچنین می توان برای خطاهایی که بروز می کند ،کاربر را به صفحه خطای سفارشی هدایت کرد.
۴/ علاوه بر هدایت به سمت صفحه عمومی برای همه خطاها، می توان برای کد خاصی از خطاها، صفحات خاصی را مشخص نمود. ترکیب <customErrors> از برچسب داخلی<error> که کدهای HTTP را به صفحات خطای سفارشی مرتبط می کند،پشتیبانی می کند.
۵/ خطاها را میتوان در هر دو سطح صفحه و برنامه توسط کد راه اندازی کرد.کلاس پایه Pageدارای متد Page_Error است، که میتوان از خاصیت override آن در صفحات خود بهره برد.این متد هر زمان که اتفاق بی دلیلی در زمان اجرا رخ دهد،فراخوانی می شود.
۶/ فضانام System.Web.Mail کلاسهایی را جهت ارسال ایمیل از طریق برنامه در اختیار قرار می دهد که می تواند ابزار مفیدی جهت اعلام بروز خطا به مدیر برنامه باشد.
۷/ علاوه بر راه اندازی خطاها در سطح صفحه ، از رویداد Application_ErrorدرGlobal.asax برای بررسی خطاها در سطح برنامه استفاده می شود.این رویداد برای هر پیشامد غیرمنتظره ای در برنامه اجرا می شود.
۸/ فضانام System.Diagnosticsکلاسهایی را جهت نوشتن در گزارش رویداد ویندوز مهیا کرده است.
خطاها را میتوان در هر دو سطح صفحه و برنامه توسط کد راه اندازی کرد. کلاس پایه Page دارای متد Page_Error است، که میتوان از خاصیت override آن در صفحات خود بهره برد. این متد هر زمان که اتفاق بی دلیلی در زمان اجرا رخ دهد، فراخوانی می شود.
<script language="C#" runat="server">
void Page_Error(Object source, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>"
+ Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
}
</script>
مثال زیر متدPage_Error را نشان میدهد.
[error2.aspx]
<html>
<script language="C#" runat="server">
void Error_500(Object sender, EventArgs e) {
String foo = null;
Response.Write(foo.ToString());
}
void Page_Error(Object sender, EventArgs e) {
String message = "<font face=verdana color=red>"
+ "<h4>" + Request.Url.ToString() + "</h4>"
+ "<pre><font color='red'>" + Server.GetLastError().ToString() + "</pre>"
+ "</font>";
Response.Write(message);
Server.ClearError();
}
</script>
<body>
<form runat="server">
<h4><font face="verdana">Cause an Error to Occur...</font></h4>
<asp:button text="500 Server Error" OnClick="Error_500″ width="150″ runat="server"/><p>
</form>
</body>
</html>
می توان برخی اقدامات مفید ازقبیل ارسال یک ایمیل به مسئول سایت برای گفتن اینکه صفحه بدرستی اجرا نشده، انجام داد.ASP.NET مجموعه کلاسهایی در فضانام System.Web.Mail دقیقا به همین منظور داراست. برای فراخوانی این فضانام از دستور @Import در بالای صفحه خود به شکل زیر استفاده می کنیم:
<%@ Import Namespace="System.Web.Mail" %>
میتوان از اشیاء MailMessage و SmtpMail جهت ارسال برنامه وار ایمیل استفاده نمود.
MailMessage mail = new MailMessage();
mail.From = "automated@www.contoso.com";
mail.To = "administrator@www.contoso.com";
mail.Subject = "Site Error";
mail.Body = message;
mail.BodyFormat = MailFormat.Html;
SmtpMail.Send(mail);
مثال زیر نشان میدهد که چگونه ایمیلی در پاسخ به خطای صفحه ارسال می شود.
نکته: این مثال در حقیقت تا زمانی که سرویس Mail SMTP بر روی سیستم فعال نشده باشد، ایمیلی ارسال نمی کند. برای اطلاعات بیشتر در رابطه با سرویس Mail SMTP، در مستندات IIS جستجو شود.
[error3.aspx]
<%@ Import Namespace="System.Web.Mail" %>
<html>
<script language="VB" runat="server">
Sub Error_500(sender As Object, e As EventArgs)
Dim foo As String = Nothing
Response.Write(foo.ToString())
End Sub
Sub Page_Error(Sender As Object, E As EventArgs)
Dim message As String = "<font face=verdana color=red>" _
& "<h4>" & Request.Url.ToString() & "</h4>" _
& "<pre><font color=red>" & Server.GetLastError().ToString() & "</pre>" _
& "</font>"
Response.Write(message)
Response.Write("An error has occured on this server, and the administrator of the site has been notified.")
Dim mail As New MailMessage
mail.From = "automated@www.contoso.com"
mail.To = "administrator@www.contoso.com"
mail.Subject = "Site Error"
mail.Body = message
mail.BodyFormat = MailFormat.Html
SmtpMail.Send(mail)
Server.ClearError()
End Sub
</script>
<body>
<form runat="server">
<h4><font face="verdana">Cause an Error to Occur...</font></h4>
<asp:button text="500 Server Error" OnClick="Error_500″ width="150″ runat="server"/><p>
</form>
</body>
</html>
علاوه بر راه اندازی خطاها در سطح صفحه، ممکن است نیاز به بررسی خطاها در سطح برنامه باشد. به همین منظور، از رویداد Application_Error در Global.asax استفاده می شود. این رویداد برای هر پیشامد غیرمنتظره ای در برنامه اجرا می شود.
void Application_Error(Object sender, EventArgs e) {
//...Do something here
}
نوشتن در گزارش رویداد (Event Log)
فضانام System.Diagnostics کلاسهایی را جهت نوشتن گزارش رویداد ویندوز مهیا کرده است. برای استفاده از این فضانام در صفحات، در ابتدا باید فضانام به شکل زیر فراخوانی شود:
<%@ Import Namespace="System.Diagnostics"%>
کلاس EventLog گزارش را در خود ذخیره می کند. همچنین متدهای ایستایی برای بازیابی و یا ایجاد گزارش فراهم ساخته و می تواند جهت نوشتن گزارش ارسالی از طریق کد، معرفی شود. مثال زیر مراحل را طی متد Application_Error از Global.asax نشان می دهد. هرگاه وقفه غیرمنتظره ای در برنامه اتفاق بیافتد، یک ورودی شامل پیغام خطا و ردیابی پشته در گزارش برنامه ایجاد می شود.
void Application_Error(Object sender, EventArgs e) {
String Message = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create event Log if it does not exist
String LogName = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into event log
EventLog Log = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
کد کاملی برای مثال بالا در زیر موجود است. توجه شود که این کد به جهت جلوگیری از ورود به گزارش رویداد ویندوز سیستم شما غیرفعال شده و بنابراین نمی تواند اجرا شود. اگر مایل به مشاهده اجرای این کد باشید یک ریشه مجازی IIS که دربرگیرنده شاخه شامل این فایل است، ایجاد کنید.
[Global.asax]
<%@ Import Namespace="System.Diagnostics" %>
<script language="C#" runat="server">
void Application_Error(Object sender, EventArgs e) {
String Message = "\n\nURL:\n http://localhost/" + Request.Path
+ "\n\nMESSAGE:\n " + Server.GetLastError().Message
+ "\n\nSTACK TRACE:\n" + Server.GetLastError().StackTrace;
// Create Event Log if it does not exist
String LogName = "Application";
if (!EventLog.SourceExists(LogName)) {
EventLog.CreateEventSource(LogName, LogName);
}
// Insert into Event Log
EventLog Log = new EventLog();
Log.Source = LogName;
Log.WriteEntry(Message, EventLogEntryType.Error);
}
</script>
خلاصه
۱/ خطاها به چهار رسته تقسیم می شوند:خطاهای وضعیتی،خطاهای پارسر،خطاهای زمان کامپایل، و خطاهای زمان اجرا.
۲/ بطور پیش فرض، اطلاعاتی که برای خطای زمان اجرا نمایش داده می شوند،بصورت فراخوانی از پشته می باشد(زنجیره ای از فراخوانی های رویداد که وقفه را راه اندازی می کند). هنگامی که مد اشکالزدایی فعال باشد، ASP.NET شماره خطی از کد که خطای زمان اجرا در آن واقع شده نشان می دهد.
۳/ قابلیت تعیین نمایش یا عدم نمایش خطاها به clientهای محلی، clientهای راه دور و یا هر دو در ASP.NET وجود دارد. بطور پیش فرض، خطاها فقط برای clientهای محلی (clientهای موجود در همان کامپیوتر سرور ) نمایش داده می شوند. همچنین می توان برای خطاهایی که بروز می کند ،کاربر را به صفحه خطای سفارشی هدایت کرد.
۴/ علاوه بر هدایت به سمت صفحه عمومی برای همه خطاها، می توان برای کد خاصی از خطاها، صفحات خاصی را مشخص نمود. ترکیب <customErrors> از برچسب داخلی<error> که کدهای HTTP را به صفحات خطای سفارشی مرتبط می کند،پشتیبانی می کند.
۵/ خطاها را میتوان در هر دو سطح صفحه و برنامه توسط کد راه اندازی کرد.کلاس پایه Pageدارای متد Page_Error است، که میتوان از خاصیت override آن در صفحات خود بهره برد.این متد هر زمان که اتفاق بی دلیلی در زمان اجرا رخ دهد،فراخوانی می شود.
۶/ فضانام System.Web.Mail کلاسهایی را جهت ارسال ایمیل از طریق برنامه در اختیار قرار می دهد که می تواند ابزار مفیدی جهت اعلام بروز خطا به مدیر برنامه باشد.
۷/ علاوه بر راه اندازی خطاها در سطح صفحه ، از رویداد Application_ErrorدرGlobal.asax برای بررسی خطاها در سطح برنامه استفاده می شود.این رویداد برای هر پیشامد غیرمنتظره ای در برنامه اجرا می شود.
۸/ فضانام System.Diagnosticsکلاسهایی را جهت نوشتن در گزارش رویداد ویندوز مهیا کرده است.
تاريخ:جمعه، 18 اردیبهشتماه 1388 | نظرات [ 0 ] |

