Вопрос об обработке ошибок пакета Perl - PullRequest
1 голос
/ 08 апреля 2011

У меня есть пакет под названием «SamplePkg».У меня есть другой скрипт, который использует SamplePkg, создает объект и вызывает метод.

<code>
package SamplePkg;
use strict;
use DBI;
use Try::Tiny;</p>

<p>my $dbh = DBI_>connect(..., { RaiseError => 1 });</p>

<p>sub new { 
   my $self = {};
   $self->{CODE} = 0;
   bless($self);
   return $self;
}</p>

<p>sub do_something {
  my $self = shift;
  try { 
     my $query = "select myvalue from mytable";
     $sth = $dbh->prepare($query);
     $sth->execute();
  } catch { $self->{CODE} = 100; return; }</p>

<p>$self->{CODE} = 50;
}

Другой скрипт

<code>
use SamplePkg;</p>

<p>my $object = SamplePkg->new();
$object->do_something();</p>

<p>print "Code is: $object->{CODE}\n";

Вопросы:

  • По какой-то причине блок try не улавливает ошибку БД (myvalue не является допустимым именем столбца)
  • «return» вблок catch не возвращается к вызывающему сценарию
  • В результате выдается код ошибки 50

1 Ответ

1 голос
/ 08 апреля 2011
try { ... } catch { ... };

действительно

try(sub { ... }, catch(sub { ... }));

Возврат из подпрограммы, которая вызывается при обнаружении исключения, возвращается из этого подпрограммы, а не из подпрограммы, в которой находится try.

Вы можете использовать

try {
   my $query = "select myvalue from mytable";
   $sth = $dbh->prepare($query);
   $sth->execute();
   $self->{CODE} = 50;
} catch {
   $self->{CODE} = 100;
};

Или, может быть, вам нужно что-то более похожее на

my $success = try {
   my $query = "select myvalue from mytable";
   $sth = $dbh->prepare($query);
   $sth->execute();
   return 1;
} catch {
   return 0;
};

... do stuff ...

$self->{CODE} = $succes ? 50 : 100;
...