ASP.NET’te genel hata yönetimi

C#, VB.NET, ASP.NET Add comments

Web uygulamalarında, kullanım alanlarının geniş olması, tanımlı tanımsız binlerce ziyaretçiye hizmet veriyor olması ve bu ziyaretçilerin farklı kullanım seviyelerine sahip olmaları sebebiyle hata oluşma ihtimali yüksektir. Bu ihtimali aza indirgemek için kullanıcı ile sunucu arasında çift yönlü aktarılan verilerin daima doğrulama işlemlerinden geçirilmesi gerekmektedir. Böylece kullanıcının, uygulamaya zarar vermesi veya sunucunu ziyaretçiye doğru olmayan bilgiyi gönderme ihtimali azaltılmış olur. Buna rağmen örneğin sistemde olmayan bir sayfanın istenmesi gibi bazen düşündüğümüz ihtimallerin dışında da hatalar oluşabilir. Bu nedenle sitenin herhangi bir alanında meydana gelen tüm hataları yönetiyor olmamız lazım. Bunu yapmanın farklı yolları olsa da ASP.NET, bu amaçla etkili bir hata yönetimi(error handling) sunmaktadır.
ASP.NET uygulamasında tüm request ve response’lerin yönetildiği, bunlara ait eventlerin yakalandığı Global.asax dosyası uygulamanın herhangi bir bölümünde herhangi bir kaynaktan dolayı meydana gelen hataların yakalanacağı Application_Error() metodunu sunar. Bu metodu kullanarak, hata meydana geldiği zaman kullanıcıya ASP.NET’in tipik hata sayfasını göstermek yerine bizim oluşturacağımız mesajları göstereceğiz. Böylece hem kullanıcıyı doğru yönlendirmiş oluruz hem de uygulama yöneticisi olarak kendimizi bu durumdan haberdar etmiş oluruz.
Web uygulamasında hata meydana geldiği zaman HttpApplication sınıfına ait HttpServerUtility türündeki Server property’sinin GetLastError property’si set edilmiş olur. Bu property, System.Exception türünde değer döndürür. Bu değerin ilgili property’lerini okuyup gerekli hata mesajını oluşturacağız.

void Application_Error(object sender, EventArgs e)
{
    Exception ex = Server.GetLastError().GetBaseException();
    string HataMesaj = "";
    HataMesaj = "Hata Tarihi :" + DateTime.Now;
    HataMesaj += "Hata Mesajı : "+ ex.Message;
    HataMesaj += "Hata Sayfa ve Konumu :"+ ex.StackTrace;
    //Hatayı alan kullanıcı, sitenin üyesiyse üyelik ID'sini okuyalım.
    HataMesaj += "Kullanıcı ID :" + User.Identity.Name;
    //Sayfaya gönderilen QueryString bilgileri
    HataMesaj += "QueryString Bilgileri";
    for (int x = 0; x < Request.QueryString.Count; x++)
        HataMesaj += "
  • "+ Request.QueryString.Keys[x] + " : " + Request.QueryString[x]; //Sayfaya submit edilmiş Form bilgileri HataMesaj += "Form Bilgileri"; for (int x = 0; x < Request.Form.Count; x++) HataMesaj += "
  • " + Request.Form.Keys[x] + " : " + Request.Form[x] + ""; //Sunucu ile ilgili değişkenler HataMesaj += "Sunucu Değişken Bilgileri"; for (int x = 0; x < Request.ServerVariables.Count; x++) HataMesaj += "
  • " + Request.ServerVariables.Keys[x] + " : " + Request.ServerVariables[x] + ""; //Oluşturduğumuz hata mesajını ekrana yazdıracağımız gibi, site yöneticisine mail attırabilir veya işletim sistemin event log'una yazdırabiliriz. Response.Write(HataMesaj); Server.ClearError(); }//Application_Error
  • Bu metod içerisinde hata mesajını doğrudan ziyaretçiye, yönlendirme amacıyla gösterebilir, loglama amacıyla veritabanına yazdırabilir veya kendimize mail attırabiliriz. Aşağıdaki tabloda metodun VB.NET versiyonunu bulabilirsiniz.

    Private Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
        Dim ex As Exception = Server.GetLastError().GetBaseException()
        Dim HataMesaj As String = ""
        HataMesaj = "Hata Tarihi :" & DateTime.Now
        HataMesaj &= "Hata Mesajı : " & ex.Message
        HataMesaj &= "Hata Sayfa ve Konumu :" & ex.StackTrace
        'Hatayı alan kullanıcı, sitenin üyesiyse üyelik ID'sini okuyalım.
        HataMesaj &= "Kullanıcı ID :" & User.Identity.Name
        'Sayfaya gönderilen QueryString bilgileri
        HataMesaj &= "QueryString Bilgileri"
        Dim x As Integer = 0
        Do While x < Request.QueryString.Count
            HataMesaj &= "
  • " & Request.QueryString.Keys(x) & " : " & Request.QueryString(x) x += 1 Loop 'Sayfaya submit edilmiş Form bilgileri HataMesaj &= "Form Bilgileri" x = 0 Do While x < Request.Form.Count HataMesaj &= "
  • " & Request.Form.Keys(x) & " : " & Request.Form(x) & "" x += 1 Loop 'Sunucu ile ilgili değişkenler HataMesaj &= "Sunucu Değişken Bilgileri" x = 0 Do While x < Request.ServerVariables.Count HataMesaj &= "
  • " & Request.ServerVariables.Keys(x) & " : " & Request.ServerVariables(x) & "" x += 1 Loop 'Oluşturduğumuz hata mesajını ekrana yazdıracağımız gibi, site yöneticisine mail attırabilir veya işletim sistemin event log'una yazdırabiliriz. Response.Write(HataMesaj) Server.ClearError() End Sub 'Application_Error
  • Bu genel hata yönetimi, .aspx uzantılı istekleri destekler. Farklı dosya istemleri için özel bir yönetim gerçekleştirmek gerekir.

    4 Responses to “ASP.NET’te genel hata yönetimi”

    1. counter Says:

      örneğinizi kullandım. Fakat alt dizinlerdeki hataları bildirmiyor. benim ana dizininim altında birde /admin diye b ir alt klsör var. Orda hata olunca yakalamam lazım orayada mı asax dosyası atamam gerekiyor.

    2. Ahmet Kaymaz Says:

      Eğer alt dizin normal bir dosya diziniyse yani bir sanal dizin(virtual directory) değilse projenin altındaki bu dizin, root’ta tanımladığınız global.asax’ın etki alanında olacaktır. Yani bu dizin için ayrı bir config veya asax dosyası oluşturmanıza gerek bulunmamaktadır. Eğer sanal dizinse o zaman yeni bir proje olduğu için bu projeye özgü global.asax olmalıdır.

    3. zero Says:

      maili nasıl gönderebiliriz?

    4. Ahmet Kaymaz Says:

      Asp.NET ortamında mail atmak için aşağıdaki makaleleri inceleyebilirsiniz.

      http://aspnet.4guysfromrolla.com/articles/072606-1.aspx

      http://www.aspheute.com/english/20000918.asp

    Leave a Reply

    WP Theme & Icons by N.Design Studio
    Entries RSS Comments RSS Giriş