Perl'de hata işleme geleneksel olarak die, warn fonksiyonları ve eval bloğu ile yapılır. Programın doğru bir şekilde sonlanmasını sağlamak için kritik hatalar için die kullanılması ve uyarılar için warn fonksiyonunun kullanılması önerilir. İkinci bir yöntem ise, kritik hataları yakalamak ve sonrasında işlemek için eval bloğu operatörünün kullanılmasıdır.
Örnek:
open my $fh, '<', 'file.txt' or die "Dosya açılamadı: $! "; printf $fh "Merhaba" or warn "Yazamıyorum: $! "; # eval ile hata işleme my $result = eval { risky_function(); 1; }; unless ($result) { print "Hata tespit edildi: $@ "; }
Ayrıca Perl'de try/catch uygulayan Try::Tiny ve Error gibi modüller de bulunmaktadır.
eval {} ile eval "..." kullanımı arasındaki fark nedir ve her bir yöntemin potansiyel tuzakları nelerdir?
Birçok kişi bunların birbirinin aynı olduğunu düşünmektedir.
eval { ... }blok bazında bir try/catch gibi çalışırken,eval "..."bir dizeyi derleyip çalıştırır. Dize kullanırken hata yapma olasılığı yüksektir ve kodun SQL enjeksiyonlarına veya derleme hatalarına maruz kalma riski vardır.
Farklılıkların örneği:
# Dizeyi Perl kodu olarak derleyip çalıştırır my $var = 'my $x = 2 + 2'; eval $var; # eval KİRLETİCİ! # Güvenli blok versiyonu my $error = eval { die "başarısız"; }; print $@ if $@;
Hikaye
Bir projede geliştiriciler dinamik komut oluşturmak için eval "kod" kullanmışlardır, bu da çalışma zamanında ulaşılamaz sözdizim hatalarına ve hata ayıklama sorunlarına yol açmıştır.
Hikaye
Yanlış hata yakalama: eval içinde yerel değişkenler kullanılarak tetiklenen istisnalar işlenmemiştir, çünkü $@ sonraki log fonksiyonu çağrısı ile silinmiştir.
Hikaye
Eski kodda try/catch yerine sadece die() kullanılmış, bu da Perl sürecinin kontrolsüz bir şekilde sonlanmasına ve veritabanı işlemlerinde veri kaybına sebep olmuştur.