Makale Özeti

CLRın bir parçası olan "Exception Handling" .Net programcılarına hata yönetimi konusunda oldukça yardımcı olacaktır....

Makale

Hata Yönetimi(Cusom Error Handling)

CLRın bir parçası olan "Exception Handling" .Net programcılarına hata yönetimi konusunda oldukça yardımcı olacaktır.

Uygulamanızda runtime veya design-time hatalar meydana geldiğinde ASP.Net standart hata sayfasını ekranan getirir. Bu hata sayfası meydana gelen hata hakkında detaylı bilgiler içerir. Öyleki hatanın olduğu satıra ve hata türüne özel açıklamalar ile birlikte gelir bu sayfa karşımıza. Bahsettiğimiz tipte bir hata sayfası şüphesiz test aşamalarında birçok programcının işine yarayacaktır ancak hiçbirinizin bu şekilde design edilmiş hata sayfalarını kullanıcılarına göstermek istemeyeceğini düşünüyorum.

Şimdi çok basit bir örnek yapalım. Sayfamızda bir Label ımız ve bir butonumuz olsun. Bu buton tıklandığında sayfamız "trial.aspx" e yönlensin. Ve biz karşımıza çıkacak default hata sayfası üzerinde konuşmaya devam edelim.

WebForm1.aspx

<%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb"
Inherits="HataOrnek.WebForm1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<title></title>
<meta name="GENERATOR" content="Microsoft Visual Studio.NET 7.0">
<meta name="CODE_LANGUAGE" content="Visual Basic 7.0">
<meta name="vs_defaultClientScript" content="JavaScript">
<meta name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">
<asp:Label id="Message" style="Z-INDEX: 101; LEFT:
34px; POSITION: absolute; TOP: 46px" runat="server"></asp:Label>
<asp:Button id="ErrorButton" style="Z-INDEX: 102; LEFT: 268px;
POSITION: absolute; TOP: 41px" runat="server" Text="Generate Error"></asp:Button>
</form>
</body>
</HTML>


WebForm1.aspx.vb

Public Class WebForm1
Inherits System.Web.UI.Page
Protected WithEvents Message As System.Web.UI.WebControls.Label
Protected WithEvents ErrorButton As System.Web.UI.WebControls.Button

Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Message.Text = "This sample page generates an Error..."
End Sub

Public Sub ErrorButton_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Handles ErrorButton.Click
Response.Redirect("Trial.aspx")
End Sub

End Class


BU sayfayı browser ınızda çağırdığınızda karşınıza aşağıdaki ekran gelecektir:



Ve butona basmanızın ardından karşınıza gelecek sayfa:



Ve butona basmanızın ardından karşınıza gelecek sayfa:



Varsayılan hata sayfası için konfigurasyon dosyanızda 3 seçeneğiniz var. Burada kasdettiğim konfigurasyon sayfası elbette web.config.
1) Off Mode
2) On Mode
3) RemoteOnly Mode

Burada vereceğiniz karar önemli. Varsayılan olarak ASP.Net "RemoteOnly" i seçili kılacaktır.

Off Mode:
Bu moddayken ASP.Net local ve remote kullanıcılar için default hata sayfasını görüntüler.

Web.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<customErrors mode="Off" />
</system.web>
</configuration>


Web.config dosyanızı bu şekilde oluşturduğunuzda karşınıza çıkacak sayfa görüntüsü:



On Mode:
Bu moddayken ASP.Net local ve remote kullanıcılara web.config içinde belirttiğiniz özel hata sayfanızı görüntüleyecektir.

Web.Config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<customErrors defaultRedirect="error.htm" mode="On" />
</system.web>
</configuration>




Yazımızın bu aşamasına kadar zaten birçoğunuzun bildiği veya uyguladığı konulardan bahsettim. Bir çoğumuz zaten özelleştirilmiş hata sayfaları konusunu uygulamalarında kullanıyordu. Şimdi konuya biraz daha değişik açıdan bakalım. Başta "....ancak hiçbirinizin bu şekilde design edilmiş hata sayfalarını kullanıcılarına göstermek istemeyeceğini düşünüyorum." demiştim. Evet hiçbirimiz bu tasarıma sahip ve içeriği zaman zaman tehlikeli olabilecek hata sayfalarını kullnıcılarımıza göstermek istemeyiz ama hepimiz hazırladığımız uygulamada herhangi bir hata meydana geldiğinde bunu bilmek isteriz. Bunun 2 yolu var ilk bakışta aklıma gelen. Birincisi Event Log içine kayıt girilmesini sağlamak diğeri ise uygulama geliştiriciye,sistem yöneticisine yada her kim uygulamanızın teknik tarafı ile ilgili ise ona e-posta göndermek.

Event Log Kaydı
ASPden birçoğunuzun bildiği Global.asa dosyasının ismi bildiğiniz gibi ASP.Net te Global.asax oldu. Event Loga kayıt girerken kullanacağımız dosyada bu olacak. Bildiğiniz gibi global.asax dosyası "Application_Start","Application_Error" gibi alt sınıflar içerir. Biz de kodlarımızın hata esnasında çalışmasını istediğimiz için Application_Error Sub ının içine yazacağız kodlarımızı.

Imports System.Web
Imports System.Web.SessionState
Imports System.Diagnostics

Public Class Global
Inherits System.Web.HttpApplication

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)

Dim ErrorDescription As String = Server.GetLastError.ToString

Creation of event log if it does not exist
Dim EventLogName As String = "ErrorSample"
If (Not EventLog.SourceExists(EventLogName)) Then
EventLog.CreateEventSource(EventLogName, EventLogName)
End If

Inserting into event log
Dim Log As New EventLog()
Log.Source = EventLogName
Log.WriteEntry(ErrorDescription, EventLogEntryType.Error)

End Sub

End Class


Yukarıdaki kodda dikkat etmeniz gereken en can alıcı satır "Imports System.Diagnostics" olmalı. Event Log da kayıtlarınızı tutabilmek için bu namespace i projenize referans olarak eklemelisiniz.

Işte az önce ekrana getirdiğimiz özelleştirilmiş hata sayfasının Event Log a düştüğü hata kaydı.




Sistem Yöneticisine E-Postagöndermek

Az öncede söz ettiğim gibi her uygulama geliştirici tamamladığı uygulamasının verdiği hata mesajlarından haberdar olmak ister. Bu sebep ile bazen event log kayıtları gözden kaçabilir. Ancak e-posta yı gözden kaçırma olasılığınızın az olması ve daha hızlı müdehale etme şansı sebebi ile ben e-posta uyarısını tercih ediyorum.

Yine kullanacağımız dosya Global.asax ve Global.asax ın Application_Error altı sınıfı.E-posta göndermek ASP.Net te klasik işlemler arasında.Artık eskisi gibi sunucunuzun desteklediği bileşenler karmaşası yaşamıyorsunuz. Mail tasarımı size kalmış. Önemli olan hata mesajını aynen mailin body sine yazdırabilmek. Bu sebep ile "Server.GetLastError.ToString" satırını kullanıyoruz. Mailimizin tüm kodlarını görmek isteyecek olursak:

Imports System.Web
Imports System.Web.SessionState
Imports System.Web.Mail

Public Class Global
Inherits System.Web.HttpApplication

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)

Dim mail As New MailMessage()
Dim ErrorMessage = "Hata Mesajı : " & Server.GetLastError.ToString
mail.To = "administrator@domain.com"
mail.Subject = "..... Sitesinde Hata!"
mail.Priority = MailPriority.High
mail.BodyFormat = MailFormat.Text
mail.Body = ErrorMessage
SmtpMail.Send(mail)

End Sub
End Class


Evren AYAN
MaxiASP.Net
evren@maxiasp.net

Kaynak : MSDN