Makale Özeti

Masaüstü uygulamalarımıza Geri Bildirim Sistemi entegre edip kullanıcı hatalarını görüntüleyelim.

Makale

Öncelikle Merhabalar,

Bilindiği üzere küçük,orta ya da büyük çaplı projelerimizde projenin ömrünü ve kalitesini belirleyen en önemli etkenlerden biri de projenin geliştirme,test ve kullanım aşamasında oluşan hatalar ve bu hataları çözüm yöntemimizdir.Projemizin geliştirme aşamasında oluşan hatalar temel hatalar olduğundan geliştirici olarak bizler en basit try-catch-finally bloklarını kullanarak bu hatanın kaynağını belirleyebilir ve bu bilgiler doğrultusunda çözüm için alternatifler üretebiliriz.Fakat her ne kadar test süreci uygulasak ve bu test sürecini uzun tutsakta;oluşabilecek tüm hataları tahmin edemediğimizden bir den çok kullanıcıya hitap eden masaüstü projelerimzide bir geri bildirim sistemine ihtiyaç duymaktayız.Öncelikle Geri Bildirim Sisteminin nasıl çalıştığını açıklamak ile işe başlayalım ve bunun için şu senaryoyu kullanalım:

      

Resim 1.1

Resim 1.1'de Geri Bildirim Sistemimizin tmel çalışma prensibi görülmekte.Öncelikle olası hata durumunda hatayı belirlenen dosyaya yine belirlenen biçimde kaydediyor.Daha sonra kullanıcıya geri bildirimde bulunup bulunmak istemediğini soruyor.Kullanıcının geri bildirimde bulunmak istediği durumlarda hata dosyasını oluşturulan bildirime ekleyip geliştiriciye iletiyor.Ve son olarakta geri bildirimin iletim durumu ile ilgili kullanıcıyı bildiriyor.Geri Bildirim sisteminin genel olarak nasıl çalıştığını gösterdikten sonra geçelim kodlamıza.

Öncelikle projemize 2 adet Resource dosyası ekleyelim.Bu resource dosyalarımızdan ilkinin adı HataMesajlari diğerinin adı ise HataKodları olsun.Resource dosyaları program ile ilgili ikon,resim,string gibi değerleri saklamamız ve kullanmamız için kullandığımız bir yapı.HataMesajları adlı resource dosyamızda hata durumunda kullanıcıya hata ile ilgili bilgilendirme yapacağımız genel mesajları yazacağız.Bu mesajlar detaylı olmak zorunda değil.Örneğin:Veri Ekleme sırasında beklenmedik bir hata oluştu.Gibi kısa ve genel mesajlar kullanmak hem kullanıcı hem geliştirici adına daha efektif olur.

Hata Mesajılarını içerisinde barındıracağımız resource dosyamız için Resim 1.2 de ki örneği kullanabilirsiniz.

 

Resim 1.2 yi açıklamak gerekirse Name kolunu altında bulunan değerler  değişken isimlerimizi oluşturmakta.Hata_Mesajlari_1 değişkenini çağırırken Resources.Hata_Mesajlari_1 dememiz yeterli.Value değeri altında bulunan değerler ise bu değişkenlere karşılık gelen değerleri oluşturmakta.Hata_Mesajlari_1 için ekrana yazdırılacak değer "Program açılırken beklenmedik bir hata oluştu"'dur.Öte yandan HataKodları adlı resource dosyamız içerisinde de oluşan hatalara ait kodları tutacağız.Bunun için Resim 1.3 ü inceleyebilirsiniz.

Resim 1.3

Ekleyeceğiniz hata kodları için arzu ettiğiniz kombinasyonları kullanabilirsiniz.Hata kodlarını geliştiriciye iletilecek mesajda hatanın oluştuğu katman,dosya ya da sınıf hakkında genel bilgi vermesi açısından ekledim.Örneğin ilk hata kodumun kombinasyonu şu anlama gelmekte **ModülYapilari-**GirişOgeleri-00BAgdastirici-***1(ön görülen ilk hata)Bu kombinasyon ile geri bildirim geldiğinde hatanın tam olarak nerede ve hangi satırda olduğu hakkında genel bir bilgi edinebilirsiniz.Bu işlemleri yaptıktan sonra projemize bir sınıf ekliyoruz ve adını DosyaYolu.cs koyuyoruz.Bu sınıfımız hata dosyası oluştururken hangi klasöre,hangi isimle kaydedeceğimizi belirlemek ve bu klasörü oluşturmak için kullanılmaktadır.Öncelikle projemizin properties dosyası altında bulunan Resources.resx dosyasını açıyoruz ve içerisine STRING olarak NAME i Log_Dosya_Yolu olan bir değişken ekleyip VALUE değerine hata dosyamızın kaydedileceği yeri yazıyor örneğin : "//HATALAR//HATA".Daha sonra DosyaYolu isimli sınıfımıza gelip şu kodu ekliyoruz:

  private string YeniDosyaYolu = string.Empty;

YeniDosyaYolu değişkeni Dosya Yolu oluştururken kullanacağımız dosya yolunu barındırmak için oluşturduğumuz bir değişkendir.Ve bellekte o an bulunan değeri almaması için string.Empty yani boş değer almasını sağlıyoruz.Daha sonra şu fonksiyonu ekliyoruz:

Resim 1.4

Resim 1.4 te görünen kodları açıklayalım.Öncelikle if ifadesi içerisinde eğer daha önce oluşturulmamış ise Resource Dosyamıza kaydettiğimiz Dosya yolunu alıp o dosya yolu altında istenilen klasörü oluşturuyoruz.Daha sonra oluşturulmuş olması halinde var olan klasör altına "\\Modules..."ile başlayan dosya yolunu ekliyoruz.Bir çok modülüm olduğundan dosya yolum böyle uzun siz kısaltabilirsiniz.Dosya yolumuzu oluşturduktan sonra sıra geldi Hata dosyamızı yaratmaya.Olası hata ile ilgili bilgileri isterseniz text dosyası içerisinde tutabilirsiniz fakat ben XML dosyası içerisinde tutmayı tercih ettim.Bunun nedeni xml düğümleri içerisinde ilgili alanlar oluşturup hata ile ilgili detaylı bir izleme yapabilmek idi.Hata oluştuğu anda Xml dökümanı oluşturulması gerektiğinden öncelikle XML Dökümanı oluşturmak için gerekli kodları yazdım.Bunun için projemize XmlOlustur isimli bir sınıf ekleyelim ve ardından aşağıdaki fonksiyonu yazalım:

Resim 1.5

Resim 1.5 te görülen fonksiyon ile eğer daha önce oluşturulmamış ise DosyaYolu sınıfında belirttiğimiz klasörler bilgilerini alıp xml dökümanımızı oluşturucağız.Burada Oluşan Hata Detaylı yorum satırımızı oluştururken Hatalar satırı ise ilk Elementimizi oluşturmaktadır.Dosya yolumuzu belirleyip Xml dökümanımızı oluşturduğumuza göre sıra geldi olası hataları xml dökümanımızın içerisine kaydetme.Hataları kaydederken şu bilgileri eklemeyi tercih ettim Hatanın oluştuğu tarih,Hata Mesajı ve hata kodu.Bu bilgiler hatanın çözümü aşamasında bize daha sağlıklı bir yol göstereceğinden tercih ettim isterseniz genişlete bilirsiniz.Varolan Xml dökümanına oluşan hatayı yazmak için şu fonksiyonu kullandım :

  DosyaYolu YeniDosyaYolu;
        public void HataDokumaninaYaz(string HataKodu, DateTime HataninOlustuguTarih, string HataMesaji)
        {
                  YeniDosyaYolu = new DosyaYolu();
                if (File.Exists(YeniDosyaYolu.DosyaYoluOlustur()))
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(YeniDosyaYolu.DosyaYoluOlustur());
                    XmlElement HataDokumani = doc.CreateElement("HataGünlüğü");
                    HataDokumani.SetAttribute("ID", Guid.NewGuid().ToString());

                    XmlElement HataKoduSatiri = doc.CreateElement("HataKodu");
                    HataKoduSatiri.InnerText = HataKodu;
                    HataDokumani.AppendChild(HataKoduSatiri);

                    XmlElement HataTarihi = doc.CreateElement("HatanınOlustuğuTarih");
                    HataTarihi.InnerText = HataninOlustuguTarih.ToString();
                    HataDokumani.AppendChild(HataTarihi);

                    XmlElement HataMesajiSatiri = doc.CreateElement("HataMesaji");
                    HataMesajiSatiri.InnerText = HataMesaji;
                    HataDokumani.AppendChild(HataMesajiSatiri);

                    doc.DocumentElement.AppendChild(HataDokumani);

                    XmlTextWriter xmleEkle = new XmlTextWriter(YeniDosyaYolu.DosyaYoluOlustur(), null) { Formatting = Formatting.Indented };
                    doc.WriteContentTo(xmleEkle);
                    xmleEkle.Close();
                }
                else
                {
                    MessageBox.Show("Xml Dosyası Bulunamadı!");
                }