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


    + 3 = 12

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