|
|
|
|
|
|
|
|
 |
|
|
Visual Basic .NET te Hatalar ve Hata Bulma Yolları
|
Jun 23 2007 12:00AM |
VB.NET'te hataları bulma yolları:
Hata Türleri
Programlama hataları genelde üç ana kategoriye ayrılır:
- Desing Time (tasarım sırası)
- Runtime (çalışma sırası)
- Logic errors(mantık)
Tasarım sırası oluşan hatalar, syntax errors (yazım hatası) olarak ta bilinir. Bu hatalar, programladığınız yapının yazdığınız kodları tam olarak anlayamamasından kaynaklanır. Bunları saptamak kolaydır, çünkü VB. NET'in akıllı yazım denetim sistemi hatalı yazılan kodların altını dalgalı çizgi ile belirler. Eğer, hatayı farketmeden, programı çalıştırmak isterseniz, bir uyarı penceresi size bir hata olduğunu bildirir.
Çalışma sırası oluşan hataları saptamak çok daha zordur. Bu hatalar, programınızın yapmaması gereken bir işlemi yapmaya çalıştığı sırada oluşur. Örnek: Olmayan bir dosyayı açmaya çalışmak. Çalışma sırası hatalar, genellikle programın çökmesine neden olur. Bu tür bir hata oluşursa, sorumlusu her zaman progamcıdır. Yani siz! Programcı olarak, çalışma sırasında da oluşabilecek hataları önceden kestirmek ve gerekli önlemleri almak zorundasınız. Diyelim ki, belli bir yoldaki bir veritabanını açmaya çalışıyorsunuz, ve o veritabanı daha önce başka bir konuma taşınmış olsun. Sizin daha önce bu ve benzeri durumları tahmin etmeniz ve uygun önlemi almanız gerekmektedir.
Mantık hataları da programınız çalışırken oluşur. Programınızın davranması gerektiği gibi davranmaması sonucu oluşurlar. En bilinen örnek sonu gelmeyen bir döngü çalıştırmanızdır. Diyelim ki aşağıdaki gibi bir kod yazmış olun:
Do While x > 10
Loop
Eğer x değeri 10'dan büyük olursa, bu döngüyü durduracak bir şey de yazmamışsanız, durmaksızın dönecek ve dönecektir.
Mantık hataları da programınızın çökmesine neden olur. Ama en azından hatalı çalışmasını engellerler.
Desgin Time Errors (Tasarım Sırası Oluşan Hatalar)
Tasarım sırası oluşan hatalar için, hatırlarsanız, yazım hataları demiştik. VB.NET yazdığınız kodları anlayamadığı zaman oluşur. Bu ifade anlaşılır olmadıysa, aşağıda bir örnek verelim:
Yeni bir Windows projesi başlatın.
Formunuza bir Textbox ve bir Buton ekleyin.
Name özelliklerini değiştirmeden, varsayılan değer de yani Button1 ve Textbox1 olarak bırakın
Butona tıklayıp kod penceresine şunu yazın:
Textbox2.Text = "Debug"
Daha bu yukarıdaki kod satırını yazmayı bitirmeden, VB.NET hemen TextBox2'nin altına dalgalı çizgi çizecektir:

Fareyi TextBox2'nin üzerinde bekletirseniz, sarı renkte bir ipucu yazısı çıkacaktır:

Bu hata TextBox2 adında bir text kutunuz olmadığı içindir. Bu durumu zaten "Not Declared" (Tanımlanmamış) hata ifadesinden de görebilirsiniz. Kodu şu şekilde değiştirin:
strText = "Debug"
TextBox1.Text = strText
Burada, "Debug" kelimesini strText değişkeni içine atıyoruz. Sonra bu değişken değerini, Textbox1'in Text özelliğine yüklüyoruz. Ancak VB.NET bu durumu yine hoş karşılamıyor ve dalgalı çizgilerini yine çiziyor:

Fareyi strText üzerinde tutun. Aynı "Not Declared" hata uyarısını görürsünüz:

Bu problemi çözmek için strText değişkenini tanımlamanız (DIM ile) gerekmektedir.
O zaman kodu aşağıdaki gibi değiştirin:
Dim strText As String
strText = "Debug"
TextBox1.Text = strText
Artık değişkeni tanımladığınıza göre, dalgalı çizgiler gidecektir.
Burada dikkatinizi çekmek istediğim bir durum vardır. Değişkeni tanımladık, ancak bu tanımlamanın sırası önemlidir. Eğer tanımlamayı aşağıdaki örnekte olduğu gibi değişkenin kullanıldığı satırdan sonra yaparsanız, hata oluşacaktır. İsterseniz bunu test etmek için değişken tanımlama satırının yerini değiştirin:
strText = "Debug"
TextBox1.Text = strText
Dim strText As String
Dalgalı çizgiler tekrar gelecektir. Nedeni değişken tanımlamanın üçüncü satırda yapılmasıdır. VB.NET ilk iki satırı okuduğunda, strText adındaki değişkenle ilgili hiç bir şey bilmemektedir.
Menüden View > Other Windows > Task List yolunu izler yada Ctrl + Alt + K tuş kombinasyonuna basarsanız açılan pencerede oluşan hatanın bir raporunu görebilirsiniz:

Hatanın tanımı: "Local variable 'strText' cannot be referred to before it is declared" Anlamı: Lokal strText değişkeni tanımlanmadan önce kullanılamaz.
Dim ile başlayan tanımlama satırını kodun en üstüne alırsanız, hem dalgalı çizgiler hem de bu penceredeki hata listesi kaybolacaktır.
Tasarım sırası oluşan hataları bulup düzeltmek oldukça çabuk ve kolay olabilir. Yukarıdaki resimde gösterdiğim Task List penceresi, hata bulma ve düzeltme işleriniz için başvurmanız gereken ilk yer olmalıdır.
RunTime Errors (Çalışma Sırası Oluşan Hatalar)
Çalışma sırası oluşan hataların saptanması, tasarım sırasında oluşanlardan zordur. Adından da belli olduğu gibi, bu hatalar program çalışıyorken oluşur. Bu hatalar programınızın çökmesine neden olur.
Örnek olarak programınızın çökmesine neden olabilecek çok basit bir hata "sıfıra bölme hatasıdır". Önceki sayfada buton için yazdığınız kodu değiştirerek aşağıdaki hale dönüştürün ve çalıştırıp deneyin:
Dim Num1 As Integer
Dim Num2 As Integer
Num1 = 10
Num2 = 0
TextBox1.Text = CInt(Num1 / Num2)
CInt( ) fonksiyonu, Num1 / Num2 işleminden oluşan değeri Integer'e dönüştürmektedir. Programı çalıştırıp butona basın, aşağıdaki hata mesajı ortaya çıkacaktır:

Break butonuna basın ve programı durdurun.
Sıfıra (burada Num2 değişkenine...) bölme işlemi yapmaya çalıştığınızda, VB.NET bir Overflow (taşma) hata mesajı üretir. Programlar bir sayıyı sıfıra bölmeyi hiç sevmezler ve hep hata verirler :) Vee bu eğer ki gerçek bir program içinde bir parça olsaydı, program çökecek ve suçlanacak kişi siz olacaktınız.
Eğer bir aritmetik işlemde sonuçta sıfır oluşacaksa ve bu sıfırı taşıyan değişkenin bir başka işlemde kullanılması gerekecekse, o sıfır değerinin oluşmasına karşı tetikte olmanız gerekmektedir.
Aşağıda başka bir örnek:
Toolbox'tan bir RichTextBox alıp formunuza ekleyin. RichTextBox TextBox'a benzer ama daha fonksiyoneldir. RichTextBox'ın Name özelliğini "rt1" olarak değiştirin. Butona eklediğiniz tüm kod satırlarının önüne tek tırnak koyun yada silin ve aşağıdaki kodu yazın:
rt1.LoadFile("C: est10.txt", RichTextBoxStreamType.PlainText)
Yukarıdaki satırın yaptığı tek şey "test10.txt" adlı dosyayı RichTextBox içine yüklemeye çalışmaktır. İkinci argüman ise yüklemek istediğimiz dosyanın düz text dosyası olduğunu bildirmektedir.
Programı çalıştırın ve butona basın. Eğer ki C sürücününüzün kök dizininde test10.txt adında bir dosya yok ise. Aşağıdaki runtime hata mesajı çıkacaktır:

Yukarıdaki resimde görülen hata mesajında "Aditional information:" ile başlayan satır bize gerekli bilgiyi zaten vermektedir. Ancak çalışmakta olan bir programın durduk yere bu tür bir nedenle çökmesi hiç te hoş olmayacaktır.
Çalışma Sırası Oluşan Hataları yakalamak için Try ... Catch ... Finally ... End Try Kontrol Yapısı
VB.NET'in hatalarla ilgilenmek için yapılmış hazır bir Class'ı vardır.
Bu Class'a Exception adı verilir (İstisnai yani beklenmeyen durum anlamındadır). Kodun çalışmasında bir hata oluştuğunda, yani beklenmeyen bir durum oluştuğunda otomatik olarak bir Exception nesnesi oluşur.
VB.NET'in hataları yakalamak için kullandığı yapıya Try - Catch (Dene ve Yakala) adı verilir.
Butonun kod alanına sadece Try yazın ve entera basın gerisi otomatik olarak yazılır:
Try
Catch ex As Exception
End Try
Try kelimesinin anlamı: "Bu kısımdaki kodu çalıştırmayı dene", Catch kelimesinin anlamı ise: "Buradaki hataları yakala" demektir.
ex bir değişkendir ve bu değişkenin türü bir Exception nesnesidir.
daha önce butona eklediğimiz kodu bu kez Try bölümüne yazın:
Try
rt1.LoadFile("C: est10.txt",
RichTextBoxStreamType.PlainText)
Catch ex As Exception
End Try
Programınızı çalıştırdığınızda, VB.NET Try bölümündeki kodu çalıştırmayı deneyecektir. Herşey yolunda giderse, o zaman Catch bölümüne bakmayacaktır.
Ancak, bir hata oluşursa (Yukarıda da belirttiğim gibi beklenmeyen bir durum oluşursa) VB.NET bu kez doğrudan Catch bölümüne bakacak ve orada var olan kodu çalıştıracaktır.
Şimdi Catch bölümüne aşağıdaki kodu ekleyin:
MsgBox(ex.Message)
Kodunuz aşağıdaki ekran görüntüsünü aldığım kod penceresi gibi olmalıdır:
ex bir nesne değişkeni olduğu için, onun kendine ait özellikleri ve metotları vardır. Bunlardan bir tanesi Message özelliğidir. Tahmin ettiğiniz gibi, oluşan hata mesajını içinde taşır.
Butona tıklayın. Oluşan hata mesajını gösteren bir mesaj kutusu çıkacaktır:
Bu mesaj, "Additional information" bilgisinden gelmektedir. Fakat önemli olan şey ise program hatalarını kontrol ettiğimiz için artık programınızın çökmeyeceğidir. Kullanıcının yaptığı hatayı kendisine duyurma ve bir önlem alma hakkı tanımış olduk.
Eğer herhangi bir hata önlemi almamış olsaydınız, programınızın çalışması duracak ve aşağıdaki hata mesajını alacaktınız.
Yukarıdaki hata mesajının "An unhandled exception..." ile başlayan ilk satırı bize zaten oluşan hataya karşı kodun korunmadığını bildirmektedir. Ayrıca bize ne tür bir hata oluştuğunu da bildirmektedir:
System.IO.FileNotFoundException
Bir ipucu: Eğer "Dosya bulunamadı" hatasının çıkabileceğini düşünüyorsanız,
Catch ex As Exception
kodunu aşağıdaki şekilde değiştirebilirsiniz:
Catch ex As System.IO.FileNotFoundException
Olasılık dahilinde olan farklı hatalar için birden fazla Catch bölümü kullanabilirsiniz:
Try
rt1.LoadFile("C: est10.txt",
RichTextBoxStreamType.PlainText)
Catch ex As System.IO.FileNotFoundException
MsgBox(ex.Message)
Catch ex As Exception
MsgBox(ex.Message)
End Try
VB.NET'in otomatik olarak eklemediği bir bölüm daha kaldı: Finally
Try
Catch ex As Exception
Finally
End Try
Finally bölümündeki kodlar, hata oluşsun yada oluşmasın, her zaman çalıştırılır. Siz de o zaman Finally bölümüne her halükarda çalışması gerektiğini düşündüğünüz kodları yazarsınız. Örnek olarak, Try bölümünde bir dosya açtırmış olun, hata oluşsa da oluşmasa da, bu dosyanın kapatılması gerekiyorsa, kapatma işlemini Finally bölümünde yaparsınız.
Not: Microsoft kodlarınızda standart olarak Try ve Catch bölümlerini kullanmanızı önermektedir. Tabi ki gereklilik oluşursa son bölüm olan Finally'yi de kullanmak isteyebilirsiniz. Biz de bu kurs boyunca, Finally kullanmayacağız.
Visual Basic .NET'te Mantık Hataları
Üçüncü türdeki hatalara mantık hataları (Logic errors) adı verilir. Bunları kodlama hatası olarak ta adlandırmak mümkündür. Tabi ki bu kodlama hataları sizin yaptığınız hatalardır. Bazen -ki çoğunlukla- farkedilmeleri o kadar zordur ki, saç baş yoldururlar. Kendi kendinize kim bilir kaç kez "Yahu bu neden çalışmıyor. Ne hata yaptım ki!" demişsinizdir yada diyeceksinizdir.
İlk bölümde hazırladığınız formun üzerine bir buton daha koyun ve bir mantık hatası oluşturmak üzere aşağıdaki kodu butonun Click yordamına yazın:
Dim x As Integer
Dim y As Integer
Dim answer As Integer
x = 10.5
y = 3
answer = x * y
TextBox1.Text = answer
Pekala, şimdi butona tıklayın ve sonuca bakın.
Butona tıklamadan önce sonucu baştan kaç olarak tahmin ederdiniz? 10.5 * 3 = 31.5 değil mi?
Evet, haklısınız. Ama TextBox1'de 30 yazıyor! Neden?
Buyrun size bir mantık hatası. Programın mantığının değil, sizin mantığınızın hatası.
Mantığınızın size emrettiği sonucu göremiyorsunuz değil mi? Buradaki sorun, seçtiğiniz değişken türüne dikkat ederseniz, bir tamsayı değişkeni seçmiş olmanızdır. Ondalık sayıyı (floating point number) bir Integer değişken içine aktardınız. Integer değişken sadece tamsayı tutabildiğine göre, 10.5 rakamı değişken içine 10 olarak aktarılacaktır (.5 kesilecektir). O zaman çarpılan sayılar 10 ve 3 olacaktır- ki sonuç ta 30 olacaktır tabi ki.
Buradaki önemli olay ise, VB.NET'in hiç bir tasarım zamanı hatası üretmemiş olmasıdır. Hatta çalışma zamanı hatası bile. Programı çalıştırdık ve her şey yolunda gitmiş gibi göründü ama beklediğiniz sonucu size vermedi. İşte tipik bir mantık hatası.
Mantık hataları bazen çok çabuk farkedilebilirken, bazen de kod çok uzun olduğu için, farkedilmesi oldukça güç olmaktadır. Aşağıda başka bir mantık hatası:
Button2'nin kodlarını silin ve yerine aşağıdaki kodu yazın:
Dim i As Integer,
Dim LetterCount As Integer
Dim strText As String
Dim letter As Char
strText = "Debugging"
For i = 1 To strText.Length - 1
letter = strText.Substring(1)
If letter = "g" Then
LetterCount = LetterCount + 1
End If
Next
TextBox1.Text = "G appears " & LetterCount & " times"
Bu kodun tüm yaptığı şey "g" harfinin "Debugging" kelimesi içinde kaç kez geçtiğini bulmaktır. Burada bir For döngüsü ve her dönüşte strText içinden bir harf çekmek için Substring kullanmaktayız. Char türündeki letter (anlamı: harf) değişkeni "g" harfine sahip olursa LetterCount adlı değişkenin değeri 1 arttırılmaktadır.
Son satırdaki Text kutusu içinde çıkacak rakamı 3 olarak tahmin ediyorsunuz değil mi? Ama yanıldınız. Sonuç "sıfır" olacaktır:

Hiç bir hata işareti olmadan programı çalıştırdınız ve bir sonuç aldınız. İşte size bir mantık hatası daha. Peki hata nerede?
Visual Basic .NET'te Hata Bulma Araçları (Debugging Tools)
Yukarıda , bir butona bazı kodlar eklemiştik. O Kodun yaptığı tek şey "Debugging" kelimesi içinde "g" harfini bulmak ve kaç tane "g" harfi olduğunu saymaktı. Ancak, programın bu işi yapamadığını görmüştük, sonuç olarak 3 vermesi gereken değeri sıfır olarak veriyordu. Neyin yanlış olduğunu bulmamıza yardım etmesi için, VB.NET'te Breakpoint (Kırılma Noktası) adı verilen bir araç kullanırız. Şimdi bu aracın ne olduğunu ve nasıl kullanılacağını öğrenelim.
Breakpoint
Bir breakpoint, programınızı istediğiniz yerde durdurması için VB.NET'e verdiğiniz bir emir gibidir. Marjlara tıklayarak kodun içine bir breakpoint eklersiniz ve bu yolla VB.NET'e "Bu satıra geldiğin zaman, programın çalışmasını durdur" emrini vermiş olursunuz. O zaman minik bir kahverengi daire eklenir, bu daire kodun nerede kırılmasını istediğinizi gösterir. Aşağıdaki resimler bir breakpoint'in nasıl eklendiğini göstermektedir. İlk resim kod penceresidir (Fare imlecinin yerine dikkat ediyorsunuz değil mi?):

Kod bloğunun sol tarafında marja tıklayınca, kahverengi daire oluşur:

VB.NET'in kodunuzda kırmasını istediğiniz satırın da kahverengi işaretli olduğunu farkettiniz mi?
Programınızı çalıştırın ve butona basın. Program kırılma noktasına ulaştığı anda hemen kod penceresine geri dönersiniz. Breakpoint koyduğunuz yerdeki kahverengi daire içinde şimdi bir de sarı ok vardır ve okun işaret ettiği satır da sarıya boyanmıştır:

Şu anki sarı satır ise programınızın durdurulduğu anda VB.NET'in son olarak hangi satırı çalıştırdığını göstermektedir. Kodunuzu kontrol etmeye devam etmek için F10'a basın (yada F11'e de basabilirsiniz ancak F11 farklı Sub ve Function'ların da içine girer)
Kodunuzun sonraki satırı işaretlihale gelir:

Şimdi sarı satırın altına inmek için F10'a tekrar basın. Farenizi letter değişkeninin üzerine tutun. O anda değişkenin sahip olduğu değeri görebilirsiniz:

Döngünün ilk satırında letter'in değeri "e" dir. (Değişkenin yanındaki "c" harfi ise o değişkenin bir Char olduğunu bildirmektedir. Char = Karakter)
Hoppala! "Debugging" kelimesinin ilk harfi "e" ise, baştaki "D" harfi nerede? İşte hemen problemi bulduk sanırım. Substring metodu sıfır rakamından saymaya başlar. Yani ilk harf için 1 rakamını değil sıfır rakamını kullanmamız gerekir.
O zaman, menüden "Debug > Stop Debugging" yolunu izleyerek yada araç çubuğunda Stop ikonuna basarak programınızı durdurun. Sorunlu olan satırı şu şekilde değiştirin:
letter = strText.Substring(0)
Programınızı tekrar çalıştırın ve butonu tıklayın. Kırılma noktasına döndüğünüzde, F10'a basın ve letter değişkeninin değerini, yukarıda anlattığım gibi, kontrol edin. Şimdi şöyle olmalıdır:

Bu kez, döngü başlayınca, "Debugging" kelimesinin ilk harfi yakalandı. Yani "D" harfi.
Olay çözüldü mü? Problemin nedenine ulaştık mı? Programınızı durdurun. Breakpoint'i yok etmek için kahverengi daireye tıklayın. Programı tekrar çalıştırın (bu kez engelsiz çalışacaktır). Bakın bakalım ne olacak.
"G" harfi sayısı hala sıfır! O zaman mantık hatasını hala bulamamışız demektir. Aynı yere bir Breakpoint koyun ve tekrar deneyin.
Hatayı bulana kadar F10'la adım adım kodu çalıştırabilirsiniz yada "Locals" adında başka bir hata bulma aracı kullanabilirsiniz.
Programınız hala Debug modunda iken (yani sarı satır hala var iken), menüden Debug > Windows > Locals yolunu izleyerek aşağıdaki ekrana ulaşın:

Locals'in anlamı "Lokal değişkenler" demektir. Yani, kodun bu bölümünde tanımlanan değişkenleri kastetmektedir. i, letter ve LetterCount değişkenleri pencerede görülmektedir. Ayrıca, bu değişkenlerin değerleri de gösterilmektedir: 0, Nothing ve 0.
F10'a basarsanız bu değerler değişecektir. Aşağıda ilk dönüşten sonra bu değişkenlerin değerleri görünmektedir:

i değişkeni şimdi 2 değerine sahiptir, letter ise "D" ve LetterCount hala sıfırdır! F10'a basmaya devam edin ve döngüyü bir kaç kez ilerletin. Ne farkettiniz?
letter değeri hiç değişmiyor değil mi? Hep "D" olarak kalıyor. İşte bu yüzden de LetterCount hiç sıfırdan ileri gidemiyor.
Hata denetimi bölümünü burada bitiyor
|
|
|
SAĞLAMER |
|
|
|
 |
|
|
| Video
Kategorileri |
 |
|
 |
| En
Çok İzlenen Videolar |
 |
|
|
 |
| Son
Eklenen Makaleler |
 |
|
|
 |
|
Site
İstatistikleri |
Toplam Üye: 62771
, Toplam Konu: 7063
, Toplam Cevap: 21942
,Toplam Forum: 23
, Toplam Video: 579
, Toplam Makale: 808
, Toplam Kategori: 35
En Yeni Üyemiz:
İBRAHİM
|
|
|
|
|
|