如何捕获异常但导致perl脚本继续执行?

时间:2011-05-03 12:43:17

标签: perl exception

我有一个像

这样的例外包
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;
    }

    }

在这种情况下..如果找不到图像,则必须执行命令,并且需要再次执行查找图像,但是,如果服务器响应为“错误”,则抛出异常,因此脚本停止执行和命令执行,并且不会发生下一次图像搜索迭代。如何处理和解决这个问题?

谢谢,

1 个答案:

答案 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.
...