最後我檢查了Error已被棄用。但在這裏,你會怎麼做,而不該模塊:
eval {
die "Oops!";
1;
} or do {
my $e = [email protected];
print("Something went wrong: $e\n");
};
基本上,使用eval代替try
,die代替throw
,並尋找[email protected]
例外。 eval塊末尾的真值是避免[email protected]
在5.14以前的Perl版本中再次使用之前無意中更改的成語的一部分,有關詳細信息,請參閱P::C::P::ErrorHandling::RequireCheckingReturnValueOfEval。例如,此代碼遭受此缺陷。
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14
eval {
die "Oops!";
};
if (my $e = [email protected]) {
print("Something went wrong: $e\n");
}
# BAD, DO NOT USE WITH PERLS OLDER THAN 5.14
但是請注意,當他們失敗很多Perl的操作不會引發異常;他們只是返回一個錯誤代碼。對於內置模塊和標準模塊,可以通過autodie更改此行爲。如果您使用autodie
,然後做的try/catch的標準方式是這樣的(直出autodie的perldoc的):
use feature qw(switch);
eval {
use autodie;
open(my $fh, '<', $some_file);
my @records = <$fh>;
# Do things with @records...
close($fh);
};
given ([email protected]) {
when (undef) { say "No error"; }
when ('open') { say "Error from open"; }
when (':io') { say "Non-open, IO error."; }
when (':all') { say "All other autodie errors." }
default { say "Not an autodie error at all." }
}
爲了得到一個堆棧跟蹤,看看Carp。
如何將這個警告轉儲到日誌? – pitchblack408 2012-04-29 22:30:59
我可以創建異常嗎? – pitchblack408 2012-05-08 00:28:06
我不確定你在問什麼。通過記錄日誌文件將日誌文件轉儲,並使用'die'或'croak'創建異常。你問如何把異常對象等放在一起?這將是一個單獨的問題。 – 2012-05-08 00:41:12