Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl中测试异常类型?_Perl_Eval_Exception_Die - Fatal编程技术网

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

如何在perl中测试异常类型?,perl,eval,exception,die,Perl,Eval,Exception,Die,如何检查导致脚本或eval块终止的异常类型? 我需要知道错误的类型,以及异常发生的位置。Perl方法 惯用的Perl是我们要么忽略所有错误,要么捕获它们以便记录或转发到其他地方: eval { func() }; # ignore error 或: 或者(使用-查看该页面,了解您可能希望在Perl内置异常处理上使用它的原因): 如果要检查异常类型,请使用正则表达式: if ( $@ =~ /open file "(.*?)" for reading:/ ) { # ... } 行和

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

Perl方法 惯用的Perl是我们要么忽略所有错误,要么捕获它们以便记录或转发到其他地方:

eval { func() };  # ignore error
或:

或者(使用-查看该页面,了解您可能希望在Perl内置异常处理上使用它的原因):

如果要检查异常类型,请使用正则表达式:

if ( $@ =~ /open file "(.*?)" for reading:/ ) {
    # ...
}
行和文件也在该字符串中

这是相当令人讨厌的,因为你必须知道确切的字符串。如果您确实想要良好的错误处理,请使用中的异常模块

异常::类 $@不必是字符串,它可以是对象。允许您以Java样式声明和抛出异常对象。您可以在抛出错误时传递带有错误的任意信息(文件名等),并使用对象方法而不是正则表达式解析(包括异常的文件和行号)获取该信息

如果您使用的第三方模块不使用Error::Exception,请考虑

$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };
这将把所有错误转换为Exception::Class对象


为Exception::Class对象设置适当的字符串化。

eval{blah};如果($@){blah}
因为对象析构函数可能会对($@进行重击而被破坏。使用
eval{some_code();1}或do{handle_exception()}句柄\u异常保证运行,但$@可能会丢失。仍然有一些微妙的陷阱需要避免。这就是为什么,如果您想要简单的异常处理,
Try::Tiny
是一个很好的方法。TT的文档涉及Perl中异常处理的问题。您可能还想阅读我更新的答案,其中包括Try::Tiny,以防任何新用户无意中发现。相关:和
if ( $@ =~ /open file "(.*?)" for reading:/ ) {
    # ...
}
$SIG{__DIE__} = sub { Exception::Class::Base->throw( error => join '', @_ ); };