Bölüm 8 Hata Yakalama
Kazanımlar
Şimdiye kadar yazdığımız bütün programlar, dikkat ettiyseniz tek bir ortak varsayım üzerine kurulu. Buna göre biz, yazdığımız programın kullanıcı tarafından nasıl kullanılmasını istiyorsak, her zaman o şekilde kullanılacağını varsayıyoruz. Örneğin sayıları toplayan bir program yazdığımızda, kullanıcının her zaman sayı değerli bir veri gireceğini düşünüyoruz. Ancak bütün iyi niyetimize rağmen, yazdığımız programlarda işler her zaman beklediğimiz gibi gitmeyebilir. Örneğin, dediğimiz gibi, yazdığımız programı, kullanıcının bir sayı girmesi temeli üzerine kurgulamışsak, kullanıcının her zaman sayı değerli bir veri gireceğinden emin olamayız. Mesela şöyle bir program yazdığımızı düşünün:
# girilen iki sayının toplamını verir
= readline("Bir sayı giriniz: ")
sayi1 = as.numeric(sayi1)
sayi1
= readline("Bir sayı giriniz: ")
sayi2 = as.numeric(sayi2)
sayi2
+ sayi2 sayi1
Yukarıdaki programdaki aksaklıkları irdeleyelim:
Bu program, kullanıcı sayı değerli bir veri girdiği müddetçe sorunsuz bir şekilde çalışacaktır. Peki ya kullanıcı sayı değerli bir veri yerine başka bir şey girerse ne olur?
Örneğin kullanıcı yukarıdaki programa bir sayı yerine, (bilerek veya bilmeyerek) içinde harf barındıran bir veri girerse hata veya uyarı alabilir. Bu durumlarda program istendiği şekilde çalışmayabilir.
Yazdığınız programların bu tür hatalar vermesi normaldir. Ancak son kullanıcı açısından düşündüğümüzde, kullanıcının yukarıdaki gibi bir hata mesajı görmesi yerine, hatanın neden kaynaklandığını ya da neyi yanlış yaptığını daha açık bir şekilde ifade eden bir mesaj alması çok daha mantıklı olacaktır. Zira yukarıdaki hata mesajı programcılar açısından anlamlı olabilir, ancak son kullanıcı açısından büsbütün anlaşılmazdır!
Dediğimiz gibi, programınızın çalışma esnasında bu tür hatalar vermesi normal. Çünkü yapmaya çalıştığınız işlem, kullanıcının belli tipte bir veri girmesine bağlı. Burada sizin bir programcı olarak göreviniz, yazdığınız programın çalışma esnasında vermesi muhtemel hataları önceden kestirip, programınızda buna göre bazı önlemler almanızdır. Bu durumlarda try veya tryCatch isimli fonksiyonların birinden yararlanabiliriz.
try fonksiyonu, başarısız olabilecek bir ifadeyi çalıştıran ve kullanıcının kodunun hata kurtarma işlemini gerçekleştirmesine izin veren bir yapıdır.
Genel olarak şöyle kullanılır: try(expr, silent=F, outFile="stdout")
.
Aşağıda library fonksiyonunda yüklü olmayan bir kütüphane ismi ismi girilmesine karşın try fonksiyonu içinde kullanıldığından hata bilgisi ekranda dönse de program sonlandırılmadan devam eder.
# örneğin bir kütüphane yüklemeye çalışırken
# hata oluşabilir
try({
# dosya_adi.csv dosyası yoksa hata verecektir
= read.csv("dosya_adi.csv")
veri print(str(veri))
silent = T)
},print("diğer işlemler")
## [1] "diğer işlemler"
# NOT: birden fazla işlem yapılacak ise
# expr parametresi yukarıdaki gibi
# süslü parantez "{}" ile oluşturulur.
try fonksiyonu parametreleri sırasıyla:
expr: yapılması istenen işlemler,
silent: hata çıktısının ekrana yazılıp yazılmayacağını belirlememizi sağlar. Varsayılanı FALSE dur ve hata çıktısı ekrana yazılır.
outFile: silent parametresi FALSE ise çıktının bir dosyaya yazılmasını sağlar.
stop fonksiyonu kendi hatalarımızı oluşturmamızı sağlayan bir mekanizma sağlar.
tryCatch fonksiyonu, hatalar ve uyarılar dahil olağandışı durumların üstesinden gelmek için bir mekanizma sağlar.
Genel kullanımı tryCatch(expr, ..., finally)
şeklindedir.
tryCatch(expr = { # expr parametresi
= read.csv("dosya_adi.csv")
veri print(str(veri))
error = function(err){
}, # error parametresi oluşturmak zorunlu değil
# hata durumunda yapılacak işlemler.
print("yalnızca hata oluşursa bu yazı ekrana gelir")
print(paste("Orjinal Hata:", err))
finally = {
},# hata olsa da olmasa da yapılması istenen işlemler
print("her durumda bu yazı ekrana gelir")
})## [1] "yalnızca hata oluşursa bu yazı ekrana gelir"
## [1] "Orjinal Hata: Error in file(file, \"rt\"): bağlantı açılamadı\n"
## [1] "her durumda bu yazı ekrana gelir"
tryCatch fonksiyonunda kullanılacak genel parametreler:
- expr: hata ile karşılaşabileceğiniz kod veya kodlar. Birden fazla işlem kullanılacak ise süslü parantez ile blok oluşturulur.
- error: hata olması durumunda yapılması istenen işlemler. Bu parametrenin oluşturulması zorunlu değil.
- finally: hata olsun olması çalışması istenen işlemler. Bu parametrenin oluşturulması zorunlu değil.
tryCatch fonksiyonu yukarıdaki parametreler haricinde de parametre alabilir. Detaylı bilgi için yardım metni okunabilir.
NOT: Örnekler eklenecek!