Perl - Hata İşleme
Yürütme ve hatalar her zaman birlikte gider. Var olmayan bir dosyayı açıyorsanız. o zaman bu durumu düzgün bir şekilde ele almadıysanız, programınızın kalitesinin kötü olduğu kabul edilir.
Bir hata oluşursa program durur. Bu nedenle, bir programın yürütülmesi sırasında ortaya çıkabilecek çeşitli türdeki hataları işlemek ve programı tamamen durdurmak yerine uygun eylemi gerçekleştirmek için uygun bir hata işleme kullanılır.
Bir hatayı birkaç farklı yolla tanımlayabilir ve yakalayabilirsiniz. Perl'de hataları yakalamak ve sonra bunları düzgün bir şekilde ele almak çok kolaydır. İşte kullanılabilecek birkaç yöntem.
İf ifadesi
if statementbir ifadeden dönüş değerini kontrol etmeniz gerektiğinde açık bir seçimdir; örneğin -
if(open(DATA, $file)) {
...
} else {
die "Error: Couldn't open the file - $!";
}
Burada değişken $! gerçek hata mesajını döndürür. Alternatif olarak, mantıklı olduğu durumlarda ifadeyi tek satıra indirebiliriz; örneğin -
open(DATA, $file) || die "Error: Couldn't open the file $!";
Ifade Fonksiyonu
unlessişlev if: ifadesinin mantıksal olarak tersidir: ifadeler başarı durumunu tamamen atlayabilir ve yalnızca ifade yanlış döndürürse çalıştırılabilir. Örneğin -
unless(chdir("/etc")) {
die "Error: Can't change directory - $!";
}
unlessifadesi en iyi, bir hata ortaya çıkarmak istediğinizde veya yalnızca ifade başarısız olursa alternatif olarak kullanılır. İfade, tek satırlık bir ifadede kullanıldığında da anlamlıdır -
die "Error: Can't change directory!: $!" unless(chdir("/etc"));
Burada sadece chdir işlemi başarısız olursa ölürüz ve güzel okur.
Üçlü Operatör
Çok kısa testler için koşullu operatörü kullanabilirsiniz. ?:
print(exists($hash{value}) ? 'There' : 'Missing',"\n");
Neyi başarmaya çalıştığımız burada çok net değil, ancak etki, bir if veya unlessBeyan. Koşullu operatör, bir ifade veya ifade içindeki iki değerden birini hızlı bir şekilde döndürmek istediğinizde en iyi şekilde kullanılır.
Uyarı işlevi
Uyarı işlevi yalnızca bir uyarı verir, STDERR'a bir mesaj yazdırılır, ancak başka bir işlem yapılmaz. Bu nedenle, yalnızca kullanıcı için bir uyarı yazdırmak ve işlemin geri kalanına devam etmek istiyorsanız daha kullanışlıdır -
chdir('/etc') or warn "Can't change directory";
Kalıp işlevi
Kalıp işlevi, çıkış çağırması dışında, tıpkı warn gibi çalışır. Normal bir komut dosyası içinde bu işlev, yürütmeyi hemen sonlandırma etkisine sahiptir. Programda bir hata varsa devam etmenin yararsız olması durumunda bu işlevi kullanmalısınız -
chdir('/etc') or die "Can't change directory";
Modüllerdeki Hatalar
Başa çıkabilmemiz gereken iki farklı durum var -
Modülün dosya adını ve satır numarasını belirten bir modüldeki bir hatayı bildirmek - bu, bir modülde hata ayıklarken veya özellikle komut dosyasıyla ilgili değil, modülle ilgili bir hata oluşturmak istediğinizde kullanışlıdır.
Arayanın bilgilerini aktaran bir modül içindeki bir hatayı bildirerek, hataya neden olan komut dosyası içindeki satırda hata ayıklayabilirsiniz. Bu şekilde ortaya çıkan hatalar son kullanıcı için kullanışlıdır, çünkü arayan komut dosyasının başlangıç satırıyla ilgili hatayı vurgularlar.
warn ve dieişlevler, bir modül içinden çağrıldığında beklediğinizden biraz farklı çalışır. Örneğin, basit modül -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
warn "Error in module!";
}
1;
Aşağıdaki gibi bir komut dosyasından çağrıldığında -
use T;
function();
Aşağıdaki sonucu verecektir -
Error in module! at T.pm line 9.
Bu, aşağı yukarı beklediğiniz şeydir, ancak tam olarak istediğiniz şey değildir. Bir modül programcısının bakış açısından, bilgi yararlıdır çünkü modül içindeki bir hataya işaret etmeye yardımcı olur. Bir son kullanıcı için, sağlanan bilgiler oldukça faydasızdır ve sertleştirilmiş programcı dışında herkes için tamamen anlamsızdır.
Bu tür sorunların çözümü, çağıran komut dosyasıyla ilgili bilgileri döndüren modüller içindeki hataları bildirmek için basitleştirilmiş bir yöntem sağlayan Carp modülüdür. Sazan modülü dört işlev sağlar: sazan, gümbürtü, vrak ve itiraf. Bu işlevler aşağıda tartışılmaktadır.
Sazan İşlevi
Carp işlevi, warn işlevinin temel eşdeğeridir ve gerçekte komut dosyasından çıkmadan ve komut dosyası adını yazdırmadan mesajı STDERR'a yazdırır.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
carp "Error in module!";
}
1;
Aşağıdaki gibi bir komut dosyasından çağrıldığında -
use T;
function();
Aşağıdaki sonucu verecektir -
Error in module! at test.pl line 4
Cluck İşlevi
Cluck işlevi bir tür aşırı yüklü sazan balığıdır, aynı temel prensibi izler, ancak aynı zamanda çağrılan işleve yol açan tüm modüllerin, orijinal koddaki bilgiler de dahil olmak üzere bir yığın izini yazdırır.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp qw(cluck);
sub function {
cluck "Error in module!";
}
1;
Aşağıdaki gibi bir komut dosyasından çağrıldığında -
use T;
function();
Aşağıdaki sonucu verecektir -
Error in module! at T.pm line 9
T::function() called at test.pl line 4
Croak Fonksiyonu
croak işlevi eşdeğerdir die, arayan kişiyi bir seviye yukarı bildirmesi dışında. Die gibi, bu işlev de hatayı STDERR'a bildirdikten sonra komut dosyasından çıkar -
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
croak "Error in module!";
}
1;
Aşağıdaki gibi bir komut dosyasından çağrıldığında -
use T;
function();
Aşağıdaki sonucu verecektir -
Error in module! at test.pl line 4
Sazan gibi, uyarı ve kalıp işlevlerine göre satır ve dosya bilgilerinin dahil edilmesinde aynı temel kurallar geçerlidir.
İtiraf Fonksiyonu
confess işlev gibidir cluck; die çağırır ve ardından kaynak komut dosyasına kadar bir yığın izi yazdırır.
package T;
require Exporter;
@ISA = qw/Exporter/;
@EXPORT = qw/function/;
use Carp;
sub function {
confess "Error in module!";
}
1;
Aşağıdaki gibi bir komut dosyasından çağrıldığında -
use T;
function();
Aşağıdaki sonucu verecektir -
Error in module! at T.pm line 9
T::function() called at test.pl line 4