error handling
-
error handler'la yapılan iş.
-
iyi bir programın sadece çalışması yetmez, iyi bir programin olasi tum hata risklerine hazirlikli olmasi gerekir, programcinin normal kosullarda test ettigi bir program bilgisayardan iyi anlamayan biri tarafindan kullanildiginda hata verme olasiligi her zaman vardir, bu nedenle olasi butun hatalarin tuzaklanmasi gerekir iste bu isleme error handling (hata tuzaklama) denir.
bir hata tuzaklama nasil isler?, hata tuzaklamada yapilabilecek iki sey vardir birincisi hatayi kullaniciya bir mesaj ile iletip programin isleyisini yarida kesmek ya da hata ne olursa olsun isleme devam etmesini saglamak.
bir visual basic kod ornegiyle her iki yontemi inceleyelim.
private sub ornek_modul()
on error goto errorsub
.
.
.
errorsub:
msgbox “program bir hata ile karsilasti”
exit sub
end sub
bu ornek ilk bakista iyi bir hata tuzaklamaymis gibi gorunebilir fakat atlanan bir ayrinti vardir, eger adi gecen modul baska bir modul tarafindan cagrilmis ise ve cagrilan bir modul icin bir deger dondurmesi gerekiyor ise bu kez de ana modul hataya neden olacaktir ve bu da bir hata silsilesi dogurur, bunu engellemek icin hata tuzaklamanin en uygun yerde yapilmasi ve mumkun oldugunca projenin bir kod coplugune dondurulmemesi gerekir.
simdi bu durumu baska bir ornekle aciklamaya calisalim.
public deger as integer
private sub ana_modul()
call ornek_modul
msgbox deger
end sub
private sub ornek_modul()
on error goto errorsub
deger = "hataya neden olsun diye integer bir degiskene string bir deger atiyorum"
.
exit sub
errorsub:
msgbox “program bir hata ile karsilasti”
exit sub
end sub
bu ornekte program deger degiskeninin define edildigi modulde bir hata olusturacak ve islemi yarida kesecektir fakat ornek_modul'un cagrildigi ana_modul bu hatadan habersiz oldugundan isleme devam edecek ve program yanlis bir sonuc dondurecektir cunku deger degiskenine hicbir deger atanmamistir.
oysa su sekilde yapmis olsaydik
private sub ana_modul()
on error goto errorsub
call ornek_modul
msgbox deger
exit sub
errorsub:
msgbox “program bir hata ile karsilasti”
exit sub
end sub
private sub ornek_modul()
deger = "hataya neden olsun diye integer bir degiskene string bir deger atiyorum"
.
end sub
program ana modulde hata tuzaklamasi icin hazirlanacak ve ornek module olusacak hatayi tuzaklayacakti.
simdi bir hata olustugunda bu hatayi gormezden gelip programin calismasini devam ettirmeyi deneyelim, iyi bir programcinin tercih etmeyecegi bir yontem kullanalim.
private sub ana_modul()
on error resume next
call ornek_modul
msgbox deger
end sub
private sub ornek_modul()
deger = "hataya neden olsun diye integer bir degiskene string bir deger atiyorum"
.
end sub
bir hata olustugunda resume takisiyla hata olusan satirdan itibaren programin derlenmesine devam edebiliriz fakat ilk yontemdeki gibi bu durumun da sakincalari vardir, bu durumda yine deger degiskenine bir atama olmayacagindan yanlis bir sonuc dondurecektir.
simdi bir hatayi tuzaklarken baska bir hataya nasil neden olacagimizi gorelim.
public metin as string
public dize() as string
private sub ana_modul()
call ornek_modul
dize=split(metin,",")
msgbox dize(0)
end sub
private sub ornek_modul()
on error goto errorsub
mgbox
metin = "deger1,deger2"
exit sub
errorsub:
msgbox “program bir hata ile karsilasti”
exit sub
end sub
yukaridaki ornekte ornek_modul icerisinde bir dizeye degisken atamasi yapmaya calistik fakat oncesinde hata vermesi icin karsiliksiz bir msgbox kullandik dogal olarak da kodumuz burada hatayi algiladi ve tuzaklama gerceklestirdi ancak ana_module tekrar donuldugunde dizemizin ici bos oldugundan bir hata ile daha karsilastik ve programimiz cuvalladi.
iyi bir hata tuzaklama programcinin olasi tum kullanici hatalarini tolere etmesidir eger son kodumuzda ufak bir rutusla bunu saglasaydik hataya meydan vermemis olacaktik ki en saglam hata tuzaklamasi budur.
private sub ana_modul()
call ornek_modul
if dize<>null then
dize=split(metin,",")
msgbox dize(0)
end if
end sub
(bkz: copy paste degil alinteri)
ekşi sözlük kullanıcılarıyla mesajlaşmak ve yazdıkları entry'leri
takip etmek için giriş yapmalısın.
hesabın var mı? giriş yap