şükela:  tümü | bugün
  • 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)