如何在perl中测试异常类型?

如何检查导致脚本或eval块终止的异常类型?
我需要知道错误的类型以及异常发生的位置.

解决方法

Perl的方式

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对象设置正确的字符串化.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...