Как перехватить исключения, но заставить скрипт perl продолжить выполнение? - PullRequest
0 голосов
/ 03 мая 2011

У меня есть пакет для исключений, таких как

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;

В модуле связи. Исключение выдается при каждом ответе сервера как «ОШИБКА»

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 Ответ

1 голос
/ 03 мая 2011

Прежде всего, вы не можете return в eval. Так что, вероятно, наступает конец конца и молча умирает. Я сталкивался с этим раньше ... назад, когда я учился не return от eval. :)

В противном случае, насколько я вижу, он будет делать то, что вы просите. Когда вы оборачиваете do {} while в eval, вы говорите, что вы не хотите повторного выполнения цикла, если есть исключение. Если вы хотите еще раз попытаться найти изображение, вам нужно выяснить, как обернуть это чем-то вроде:

# 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.
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...