如何检查导致脚本或eval
块终止的异常类型?
我需要知道错误的类型以及异常发生的位置。
答案 0 :(得分:13)
Idiomatic Perl是我们要么忽略所有错误,要么捕获它们以便记录或转发到其他地方:
eval { func() }; # ignore error
或:
eval { func() };
if ($@) {
carp "Inner function failed: $@";
do_something_with($@);
}
或(使用Try::Tiny - 查看该页面,了解您可能希望在Perl的内置异常处理中使用它的原因):
try { func() }
catch {
carp "Inner function failed: $_";
do_something_with($_);
};
如果要检查异常类型,请使用正则表达式:
if ( $@ =~ /open file "(.*?)" for reading:/ ) {
# ...
}
行和文件也在该字符串中。
这非常讨厌,因为你必须知道确切的字符串。如果您真的想要良好的错误处理,请使用CPAN中的异常模块。
$ @不必是字符串,它可以是一个对象。 Exception::Class允许您声明并抛出Java风格的异常对象。您可以在抛出错误时传递任意信息(文件名等),并使用对象方法而不是正则表达式解析来获取该信息 - 包括文件和行号例外。
如果您使用的是不使用Error :: Exception的第三方模块,请考虑
$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };
这会将所有错误转换为Exception :: Class对象。
Error::Exception为Exception :: Class对象设置了正确的字符串化。