我有一个像
这样的例外包package MyExceptions;
use strict;
use warnings;
use Exception::Class (
'MyExceptions::TestException' => {
fields => [qw{message}],
}
);
use Moose::Util::TypeConstraints;
class_type 'MyExceptions::TestException';
no Moose::Util::TypeConstraints;
1;
在Communicate模块中。只要服务器响应为“ERROR”
,就会抛出异常if ( $recv_data eq 'ERROR' )
{
MyExceptions::TestException->throw( message => $data );
}
elsif ( $recv_data eq 'YES' )
{
return $data;
}
脚本就是这样的
eval{
my $num = 0;
my $flag = 0;
do
{
if($num>6)
{
$flag = 1;
print "NOT found";
}
my $region = $obj->FindImage('SomeImage');
my $x = $region->getX;
my $y = $region->getY;
if(($x > 0) && ($y>0))
{
$flag = 1;
$obj->Command($x,$y);
}
else
{
$Obj->Command1('50','2','160','275','160','220');
}
$num++;
} while($flag==0);
$num = 0;
return;
};
if ( my $ex = $@ ) {
my $e ;
if ( $e = Exception::Class->caught('MyExceptions::ExecutionException'))
{
print $e->message;
}
}
在这种情况下..如果找不到图像,则必须执行命令,并且需要再次执行查找图像,但是,如果服务器响应为“错误”,则抛出异常,因此脚本停止执行和命令执行,并且不会发生下一次图像搜索迭代。如何处理和解决这个问题?
谢谢,
答案 0 :(得分:1)
首先,return
中不能eval
。所以它可能会在eval结束并且默默地死去。我之前遇到过这种情况...当我从return
学习不eval
时。 :)
否则,据我所知,它会做你所要求的。当您使用eval包装do {} while
时,如果存在异常,则表示您不希望再次执行循环。如果您想再次尝试查找图像,那么您需要弄清楚如何使用以下内容进行包装:
# try
eval {
my $region = $obj->FindImage( 'SomeImage' );
...
};
# catch
if ( my $ex = Exception::Class->caught( 'MyExceptions::ExecutionException' )) {
# logic to decide whether or not to find another image
...
}
# if we don't die/croak/"throw" in the if.
...