如何在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 '', @_ ); };