Hata Ayıklama

bykzlu-x

Üye
9 Ocak 2008
190
5
Hata Ayıklama
Her programcı, program geliştirirken çeşitli hatalar yapar. Kullanıcının programımızı sorunsuz olarak kullanabilmesi için programımızı hatasız olarak hazırlamamız gerekir. Visual Basic'te iki çeşit hata oluşabilir. İlki çözülmesi en azından farkedilmesi daha kolay olan derleme hataları, ikincisi ise farkedilene kadar çözülemeyeceğinden daha tehlikeli olarak nitelendirebileceğimiz runtime hatalardır.
Derleme hataları bir yazım hatasından oluşabileceği gibi program çalıştırıldığı anda, hatanın yapıldığı prosedürün çağırılması ile ortaya çıkabilir. Bu hatalar kendisini belli ettiğinden çözülmesi daha kolaydır.
Runtme, yani çalışma zamanı hataları ise derleme hatalarına göre daha risklidirler. Bu tip hatalar kodlama hatasından kaynaklanabileceği gibi kullanıcının yaptığı bir işlem sonucu da ortaya çıkabilirler. Örneğin varolmayan bir webbroser kontrolünü bir web sitesini açmak için kullanmaya çalışabileceğimiz gibi kullanıcımız 0/0 veya negatif bir değerin karekökünü almak isteyebilir. Bu gibi hatalarda eğer önlem almamışsak programımız bir hata mesajı verecek ve sonlanacaktır. Bu tip kullanıcıdan kaynaklanabilecek hataların oluşmasını engelleyemeyiz, ancak kullanıcımızın böyle bir hata yapması sonucu programımızın çalışmasının durmasını engelleyebiliriz. Örnek olarak; şimdi hesap makinesi programını çalıştırın ve 0 / 0 işlemini yapın. Sonuç: "İşlevin sonucu tanımsız." İşte size en basitinden bir hata ayıklama örneği..
Tasarım aşamasında karşılaştığımız hatalar biraz canımızı sıksa da programımızı kullanıcılara sunmadan önce bu hatayı farkettiğimiz için memnun olmalıyız. Visual Basic'te tasarım aşamasında bir hata ile karşılaşıldığında hepinizin gördüğünden emin olduğum bir mesaj kutusu gelir ekrana. Bu mesaj kutusunun üzerinde End / Debug / Help ve Continue butonları bulunur. (VB6da Continue pek kullanılamasa da, VB.NET'te gayet işe yarıyor) Bu ekranda End butonuna basmamız halinde programımız çalışma esasında bu hata ile karşılaşması halinde vereceği tepkiyi verir. Yani durur. Debug butonuna basmanız halinde ise, hatalı satırı işaretlenir ve hatayı düzeltmeniz beklenir.
Bizim asla önüne geçemeyeceğimiz bazı hatalar da oluşabilir. Örneğin kullanıcı zaten açık ya da kullanımda olan bir dosyayı açmak isteyebilir. Bunu önlemek için kullanıcının dosya açma talebine karşılık "İstediğiniz dosya önceden açılmış veya bir başka program tarafından kullanılıyor olabilir. Açmak istediğinizden emin misiniz?" şeklinde bir soru soramayız. Bu örnekteki gibi hataları önlemek için yapacağımız işleme "hata tuzaklama" denilmektedir.
Tuzaklama (ing: trapping) ile kastedilen; önceden tanımlanabilen hataların oluşması ihtimaline karşı, o hatanın oluşması durumunda yapılacak işlemlerin önceden belirlenmesidir.
Böylece, kullanıcı bölen olarak sıfır değerini kullanmak isterse bu işlemin gerçekleştirilemeyeceğini veya daha önceden açılmış bir dosyayı tekrar açmak isterse o dosyanın zaten açık olduğunu (vb.) bildirebilir ve programımızın çalışmasını sürdürmesini sağlayabiliriz.
Hata tuzaklama işleminde On Error ve Err deyimlerini kullanırız. On Error deyimi, bir "hata oluştuğunda" anlamına gelir ve kendisinden sonra hata oluştuğunda ne yapılacağı belirtilir. Örnek olarak programımızın tüm hataları görmezden gelmesi için;
"On Error Resume Next" ifadesini kullanırız. Bu en kolay ancak en kötü hata tuzaklama işlemidir ve bazı durumlarda programımızın bir hata mesajı belirterek sonlanmasından daha kötüsüne sebep olabilir; yanıt vermemesine (diğer bir deyişle: kitlenmesine). Dolayısıyla bu ifadeyi kullanmanız pek önerilmez.

On Error ifadesinin diğer kullanım şekli ise;
On Error Goto [etiket]

Örnek:
On Error Goto HataOlustu

Bu satıra göre bir hata oluştuğu taktirde programımız "HataOlustu" adlı etikete gidecek ve oradaki işlemleri uygulayacaktır.
Şimdi iki kullanım şekline de birer örnek vererek açıklayalım.
On Error Resume Next:

01 Private Sub hataliislem()
02 On Error Resume Next
03
04 Dim sonuc1, sonuc2
05 sonuc1 = 0/0
06 sonuc2 = 10/5
07 msgbox sonuc1
08 msgbox sonuc2
09
10 End Sub

Görebileceğiniz gibi 02 numaralı satırda On Error Resume Next ifadesini kullandık. Yani programımızın oluşacak tüm hataları görmezden gelmesini ve bir sonraki satırdan işleme devam etmesini sağladık. Eğer bunu yapmamış olsaydık programımız 05 numaralı satırda 0/0 işleminin gerçekleştirilmesinden dolayı hata verecekti. Ancak 02 numaralı satırda kullandığımız ifadeden dolayı programımız bu hatayı görmezden gelecek ve 06 numaralı satırdan devam edecektir. Sonuç olarak ise ilk mesaj kutusunda bir değer belirtilmeyecek, ikinci mesaj kutusunda ise 10/5 işleminin sonucu: 2 yazacaktır.
On Error GoTo [etiket]:
İkinci yöntemimizde ise On Error ifadesinden sonra "GoTo" ifadesini kullanıp bir etiket belirtiriz. Örnek olarak;

01 Private Sub hataliislem()
02 On Error GoTo hataolustu
03 Dim sonuc1, sonuc2
04 sonuc1 = 0/0
05 sonuc2 = 10/5
06
07 msgbox sonuc1
08 msgbox sonuc2
09
10 hataolustu:
11 msgbox "Bir hata oluştu."
12
13 End Sub

Bu örnekte ise; görebileceğiniz gibi 02 numaralı satırda programımıza bir hata ile karşılaşması halinde "hataolustu" adlı etikete gitmesini söyledik. Programımız çalışması esnasında 04 numaralı satıra geldiğinde 0/0 işleminden dolayı hata ile karşılaşacak ve 02 numaralı hatırdaki komut nedeniyle "hataolustu" adlı etiketi arayacaktır. Hata adlı etiket altında programımıza kullanıcıya bir mesaj kutusu göstermesini söyledik. Ancak dikkat etmeniz gereken bir nokta var: programımıza hatalı satırdan bir sonraki satırdan çalışmaya devam etmesini söylemedik. Dolayısıyla programımız bize "Bir hata oluştu." Dedikten sonra 10/5 işlemini gerçekleştirip sonucunu göstermeyecek. Aradaki bu küçük fark dikkat etmemeniz halinde karşılaştığı ilk hataya kadar mükemmel çalışan bir programa sahip olursunuz.
Visual Basic dilinde karşılaşmanız muhtemel her hatanın bir hata kodu vardır. Nasıl ki varolmayan bir web sayfasını görüntülemek istediğimizde web sunucusu bize http 404 kodlu bir hata mesajı gösteriyor, visual basic'te de varolmayan bir dosyayı açmaya çalışmanız sonucu karşılaşacağınız hatanın da bir kodu (53) vardır . Karşılaştığımız hatanın kodunu vehata ile ilgili bazı detayları elde etmek için "err" ifadesini kullanırız.
Err ifadesi ile kullanabileceğimiz toplam 8 method vardır. Bunlar: Clear, Description, HelpContext, HelpFile, LastDllError, Number, Raise, Source methodlarıdır.
Err ifadesinin kullanımı ile ilgili bir örnek verelim. Örnek programımız oluşan hatanın "hata kodu" nu versin.
01 Private Sub hatalisub()
02 On Error GoTo HataOlustu
03 Dim sonuc1
04 sonuc1 = 0 / 0
05 msgbox sonuc1
06
07 HataOlustu:
08 msgbox "Bir hata oluştu. Oluşan hatanın kodu: " & Err.Number
09 End Sub

Örneğimizde 04 numaralı satırda oluşan hata sonucu 08 numaralı satıra geçilir ve yukarıdaki mesajla birlikte hata kodu olarak "11" değeri gösterilir.
Oluşan hatanın kodu dışında açıklamasını da elde edebiliriz. Bunu ise "description" methodu ile yaparız. Örnek;
01 Private Sub hatalisub()
02 On Error GoTo HataOlustu
03 Dim sonuc1
04 sonuc1 = 0 / 0
05 msgbox sonuc1
06
07 HataOlustu:
08 msgbox "Bir hata oluştu. Oluşan hatanın kodu: " & Err.Number & vbnewline & "Açıklama: " & Err.Description
09 End Sub

Yukarıdaki örneğin aynısı. Tek fark hatanın açıklamasını da bildirecek olması.
Oluşan hatalar sonucu Err nesnesi bir değer alır. Yaptığımız her hata tuzaklama işlemi sonrası bu değeri sıfırlamamız iyi olacaktır. Bunu "Err.Clear" ifadesi ile gerçekleştiririz.
Şimdi programımızı tanımlayacağımız Sıfıra bölüm hatasına ve Taşma (Overflow) hatalarına ve tanımlamayacağımız diğer tüm hatalara karşı koruyacak bir hata tuzaklama yapalım.
01 Private Sub Form_Load()
02 On Error Goto HataOlustu
03 Dim sonuc1
04 X = 0/0
05 Sonuc1 = 0 / 0
06 Msgbox sonuc1
07
08 HataOlustu:
09 Select Case Err.Number
10 Case 6: hata = "Taşma."
11 Case 11: hata = "Sıfıra bölüm hatası oluştu."
12 Case Else
13 Hata = "Tanımlanmamış bir hata oluştu."
14 End Select
15 Msgbox hata
16 End sub

Programımız esnasında oluşacak hataları önlemek isteyebileceğimiz gibi bir hata oluşturmakta isteyebiliriz. Aslında buna bir hata oluşturmaktan çok simule etmek demek daha doğru olacaktır. Bunu "Err.Raise" ifadesi ile yaparız. Hemen bir örnekle açıklayalım:
01 Private Sub hataolustur()
02 Dim hatakodu
03 hatakodu = Inputbox("bir hata kodu belirtiniz.")
04 err.raise hatakodu
05 End Sub

Bu örneğimiz kodu belirtilen hatayı oluşturacaktır. Hata oluşturmakla ilgili bir örneği yazının en sonunda bulabilirsiniz.
Sıra tuzaklanabilir hata kodlarını ve açıklamalarına geldi. Bu hata kodlarını ve açıklamalarını aşağıda bulabilirsiniz. Açıklamaların sonunda ise (benim bu açıklamaları tek tek yazdığımı düşünmüyorsunuz herhalde..) bu kodları size ve açıklamalarını tek tek veren bir program kodu bulacaksınız.
3-Return without GoSub
5-Invalid procedure call or argument
6-Overflow
7-Out of memory
9-Subscript out of range
10-This array is fixed or temporarily locked
11-Division by zero
13-Type mismatch
14-Out of string space
16-Expression too complex
17-Can't perform requested operation
18-User interrupt occurred
20-Resume without error
28-Out of stack space
35-Sub or Function not defined
47-Too many DLL application clients
48-Error in loading DLL
49-Bad DLL calling convention
51-Internal error
52-Bad file name or number
53-File not found
54-Bad file mode
55-File already open
57-Device I/O error
58-File already exists
59-Bad record length
61-Disk full
62-Input past end of file
63-Bad record number
67-Too many files
68-Device unavailable
70-Permission denied
71-Disk not ready
74-Can't rename with different drive
75-Path/File access error
76-Path not found
91-Object variable or With block variable not set
92-For loop not initialized
93-Invalid pattern string
94-Invalid use of Null
96-Unable to sink events of object because the object is already firing events to the maximum number of event receivers that it supports
97-Can not call friend function on object which is not an instance of defining class
98-A property or method call cannot include a reference to a private object, either as an argument or as a return value
321-Invalid file format
322-Can't create necessary temporary file
325-Invalid format in resource file
380-Invalid property value
381-Invalid property array index
382-Set not supported at runtime
383-Set not supported (read-only property)
385-Need property array index
387-Set not permitted
393-Get not supported at runtime
394-Get not supported (write-only property)
422-Property not found
423-Property or method not found
424-Object required
429-ActiveX component can't create object
430-Class does not support Automation or does not support expected interface
432-File name or class name not found during Automation operation
438-Object doesn't support this property or method
440-Automation error
442-Connection to type library or object library for remote process has been lost. Press OK for dialog to remove reference.
443-Automation object does not have a default value
445-Object doesn't support this action
446-Object doesn't support named arguments
447-Object doesn't support current locale setting
448-Named argument not found
449-Argument not optional
450-Wrong number of arguments or invalid property assignment
451-Property let procedure not defined and property get procedure did not return an object
452-Invalid ordinal
453-Specified DLL function not found
454-Code resource not found
455-Code resource lock error
457-This key is already associated with an element of this collection
458-Variable uses an Automation type not supported in Visual Basic
459-Object or class does not support the set of events
460-Invalid clipboard format
461-Method or data member not found
462-The remote server machine does not exist or is unavailable
463-Class not registered on local machine
481-Invalid picture
482-Printer error
735-Can't save file to TEMP
744-Search text not found
746-Replacements too long
31001 - Out Of Memory
31004 - No Object

Programımızın kodu ise;
Private Sub Form_Load()
On Error Resume Next
Dim hatakodu
For i = 3 To 746
hatakodu = i
Err.Raise i
If Err.Description <> "Application-defined or object-defined error" Then
Text1.Text = Text1.Text & vbNewLine & i & "-" & Err.Description
ElseIf Err.Description = "Application-defined or object-defined error" Then
End If
Err.Clear
Next i
Text1.text = text1.text & vbnewline &
End Sub


Şimdi sıra yazının içinde söz verdiğim hata programına geldi. Hepimiz windows uygulamalarını kullanırken hata mesajlarıyla karşılaşmışızdır. Ama bir hata türü daha vardır ki insanın yüreğini (özellikle eski windows sürümlerini kullanıyorsak) ağzına getirir. (Gerçi windows xp'de bu daha az korkutucu bir şekle sokulmuştur) Beyaz ve büyükçe bir mesaj kutusu üzerinde Fatal Error başlıklı bir hata mesajı.. Bu görüntüyü windowsa zarar vermeden görmek size ilginç geliyorsa bir form üzerinde bir adet command button (command1) ekleyin ve aşağıdaki kodu yazın..
Private Declare Sub FatalAppExit Lib "kernel32" Alias "FatalAppExitA" (ByVal uAction As Long, ByVal lpMessageText As String)
Private Sub Command1_Click()
FatalAppExit 0, "Hata mesajımızın ilk satırı." & vbLf & vbLf & "Hata mesajımızın ikinci satırı.."
End Sub
Alıntıdır.
Selametle

 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.