Ana Sayfa » Ders Notları ve Örnekler » ASP.NET » Sayfa İçi Hata Yakalama - Page_Error Olayı ve Olay Günlüğü

Uyarılar :
  • Bu sayfada yazılanlar yeniden yayınlanamaz.
  • Bu örnek ders sırasındaki anlatımlardan derlenmiştir. Özellikle bir makale şeklinde yazılmamıştır. Bilgilerde eksiklikler bulunabilir.

Örnek :

<!--
   © Ercan ORAK - 2013
-->

<%@ Page Language="C#" AutoEventWireup="true" ValidateRequest="true" %>
<%@ Import Namespace="System.IO" %>

<!DOCTYPE html>
<script runat="server">

    /*    
    Bu örnekde hata ortaya çıkartmak için metin kutusuna (TextBox)
    "<script>" yazın. Sayfa sadece istek doğrulama sırasında
    hata veriyor.
    */

    /*
    Sayfalarda hataları yakalayacak, sayfaya uygun bir davranış
    seçebileceğiniz bir yormadımınız mutlaka olmalı...
    */

    /*
    Sayfaya özgü bir hata yönetimi tercih ederseniz
    sayfa içinde Page_Error yordamını kullanın. Bu yordam
    sayfada yakalanmamış (try ... catch içinde bulunmayan) 
    bir hata meydana geldiğinde çalıştırılır.
    */

    /*
    Tüm sayfalar için genel bir hata yönetimini tercih ederseniz
    "Global.asax" dosyasınadki "Application_Error" yordamını kullanın...
    */

    /*
    Page_Error yordamı bulunmayan sayfalarda hata ortaya çıktığında
    varsa Global.asax dosyasındaki Application_Error olayı çalıştılır.
    */

    void Page_Error(Object o, EventArgs e)
    {

        // Hata bilgilerini alın...
        System.Exception hata = Server.GetLastError();
        
        // Hata yönetimi önemlidir. Bir hata ortaya çıktığında şunları yapabilirsiniz...
        
        //----------------------------------------------------------------------------
        // (1) Hatayı gösterin...
        //----------------------------------------------------------------------------

        /*
            // Satır sonlarını <br /> etiketi ile değiştiriyoruz. Düzgün bir görüntü için...
            Response.Write(HttpUtility.HtmlEncode(hata.ToString()).Replace("\n", "<br>"));

            // Hatalar mutlaka günlüğe yazılmalı ki haberimiz olsun ve sonra çaresine bakabilelim...
            hatayiGunlugeYaz(hata);

            // Hatayı temizleyin...
            Server.ClearError();

            // Sayfanın durum kodunu "hatasız bitti (200)" yapın. Tarayıcı hata saymasın.
            Response.StatusCode = 200;

            // Sayfa isteğini sonlandırın. 
            Response.End();

         */

        //----------------------------------------------------------------------------
        // (2) veya belirli bir hatayı göstermeyi tercih edebilirsiniz....
        //----------------------------------------------------------------------------

        /*

        // Hata bizim göstermek istediğimiz türden bir hata ise...
        if (hata.GetBaseException() is System.Web.HttpRequestValidationException)
        {
            
            // Satır sonlarını <br /> etiketi ile değiştiriyoruz. Düzgün bir görüntü için...
            Response.Write(HttpUtility.HtmlEncode(hata.ToString()).Replace("\n", "<br>"));
            
            // Hatalar mutlaka günlüğe yazılmalı ki haberimiz olsun ve sonra çaresine bakabilelim...
            hatayiGunlugeYaz(hata);
            
            // Hatayı temizleyin...
            Server.ClearError();

            // Sayfanın durum kodunu "hatasız bitti (200)" yapın. Tarayıcı hata saymasın.
            Response.StatusCode = 200;

            // Sayfa isteğini sonlandırın. 
            Response.End();

        } 
        */

        //----------------------------------------------------------------------------
        // (3). veya bir hata sayfasına yönlendirin...
        //----------------------------------------------------------------------------

        /*

        // "Hatalar mutlaka günlüğe yazılmalı ki haberimiz olsun ve sonra çaresine
        // bakabilelim" demişmişmiydik?..
        hatayiGunlugeYaz(hata);
    
        // Hatayı temizleyin...
        Server.ClearError();
    
        // "Bir hata vardı ama bir şey yapamadık" gibi bir özür bulunan bir sayfaya
        // yönlendirebilirsiniz. Hatta "Sonra yine deneyin" diyebilirsiniz.
        // Ama denerler mi bilinmez.
        Response.Redirect("BirHataVar.aspx");

        */

        //----------------------------------------------------------------------------
        // (4) ya da işinize gelmiyor veya çaresizseniz veya çok önemli değilse sesinizi
        // çıkarmayın, sayfayı post ve get olmadan kendine yönlendirin...
        //----------------------------------------------------------------------------

        // Hatalar mutlaka .... gerisini biliyorsunuz.
        hatayiGunlugeYaz(hata);

        // Hatayı temizleyin, yoksa yine çıkar.
        Server.ClearError();
    
        // Sayfa kendisini herhangi bir post veya get olmadan yeniden çağırsın...
        Response.Redirect(Path.GetFileName(Request.Url.AbsolutePath));
        
    }
    
    /*
    Sitemizde meydana gelen olayları günlüklere yazmak iyi bir fikirdir, hatta
    ciddi işler yapıyorsanız buna mecbur kalırsınız. Özellikle
    meydana gelen hataları günlük dosyalarına kaydederek bir çok öngürülmeyen
    hatadan haberimiz olur ve sonradan bunlara uygun biçimde müdahale edebiliriz.
    */

    /*
    Aşağıdaki gibi hataları günlüğe kayıt eden bir yordamı App_Code içinde ayrı
    bir statik sınıf olarak oluşturursanız tüm sayfalarınızdan kullanabilirsiniz.
    */

    void hatayiGunlugeYaz(Exception e)
    {
        // Aşağıdakilerin çalışması için sitenizin ana dizininde "gunlukler"
        // isimli bir klasör ve bu klasördeki dosyalara yazma izni olmalı...

        // Altta kaydedilmesi önerilen bilgilerin hepsini kaydetmeyebilirsiniz. Ama
        // bu şekilde kullanmanızı ve hatta burada bahsetmediğimiz işe yarar ekleri
        // de yaparak hata kaydı işini güçlendirmenizi ve daha işe yarar hale getirmenizi
        // tavsiye ederiz.

        // Hatalar derhal giderilmelidir. Hatalar siteye güveni ortadan kaldırır.
        
        StreamWriter sw = new StreamWriter(Server.MapPath("~/gunlukler/hatagunlugu.log"),
                                           true,
                                           Encoding.UTF8);
        sw.WriteLine("--- HATA ---");
        
        // Olay zamanını kaydedin
        sw.Write("Zaman          :");
        sw.WriteLine(DateTime.UtcNow.ToString());
        
        // IP numarasını da kaydedin. Bazen çok lazım olur.
        sw.Write("IP             :");
        sw.WriteLine(Request.ServerVariables["REMOTE_ADDR"]);
        
        // Hata metnini kaydedin                                   
        sw.Write("Hata Metni     : ");
        sw.WriteLine(e.ToString());

        // Hatanın nerede oluştuğu, hata oluşan yere kadar olan birbirini çağıran
        // fonksiyonları gösteren StackTrace (Yığın izlemesi) adlı uzunca bir
        // bilgiyi bu şekilde alıp kaydedebilirsiniz. Hatanın sebebi her zaman
        // hatanın ortaya çıktığı satır olmayabilir. Bu nedenle bu bilgi çok
        // işinize yarayabilir...
        sw.Write("Yığın izlemesi : ");
        sw.WriteLine(e.StackTrace);

        // Kullanılan dil'i kaydedin. Belki uzak bir yerlerden bir müdahale vardır.
        sw.Write("Dil            : ");
        sw.WriteLine(Request.ServerVariables["HTTP_ACCEPT_LANGUAGE"].ToString());                      
        
        // Tarayıcı türünü kaydedin. Tarayıcıların sayfaları yorumlamada farklı
        // davranışları vardır. Bazen bunlar da hatanın sebebini bulmakta
        // faydalı olabilir.
        sw.Write("Tarayıcı       : ");
        sw.WriteLine(Request.Browser.Type);

        // Tarayıcı sürümünü de kaydedin. Belki eski bir tarayıcıyla istek yaptı.
        sw.Write("Sürüm          : ");
        sw.WriteLine(Request.Browser.Version);

        // Hangi işletim sistemi ile girdiğini kaydedin.
        sw.Write("İşletim sistemi: ");
        sw.WriteLine(Request.Browser.Platform);

        // İstek adresini kaydedin.
        sw.Write("Yol            : ");
        sw.WriteLine(Request.Path.ToString());

        // İstek adresinin sorgu dizesini (QueryString) kaydedin. Adres çubuğunu
        // kurcalayan çok olur ya da bir sorğu dizesinde bir hata yapmış olabiliriz.
        sw.Write("Sorgu Dizesi   : ");
        sw.WriteLine(Request.QueryString.ToString());

        // Gelen form bilgisini de kaydedin. Bakalım ne göndermişler.
        sw.Write("Form Bilgisi   : ");
        sw.WriteLine(Request.Form.ToString());

        sw.WriteLine("--- HATA SONU ---");
        sw.Flush();
        sw.Close();
        sw.Dispose();

    }
    
    void Page_Load(Object o, EventArgs e)
    {

    }
    
</script>


<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <title>Sayfa İçi Hata Yönetimi - Page_Error Yordamı</title>
</head>
<body>
    <h2>Sayfa İçi Hata Yönetimi - Page_Error Yordamı</h2>
    <form id="form1" runat="server">
        
       <asp:TextBox ID="tbBirseyYaz" runat="server"  />

       <asp:Button ID="btnSil" Text="Veriyi Gönder" runat="server" />

    </form>
</body>
</html>

İletişim : hazirsite@gmail.com