Re: Обработка исключений на perl

2005-11-20 Пенетрантность Alexander Lourier
В сообщении от Среда 16 Ноябрь 2005 15:39 Dmitry E. Oboukhov написал(a):

 так вот я столкнулся с тем, что данный код не рабочий, написал такой вот
 тест:
 dimka:[/home/dimka]$ cat test.pl
 #!/usr/bin/perl

 sub testik
 {
   eval
   {
 return;
   };
   print Privet\n;
 }

 то есть return из под eval не работает

Если единственная цель этого действия - это организация исключений через 
обрабочик die, то нужно всю логику блока исключений внести внутрь eval и 
сделать такую обертку:

my $val = eval {
  # некоторый код, который может что-то возвратить через return,
  # а может сгенерировать исключение.
};
return $val unless $@;
# тут обработчик исключения


-- 
Best regards, Alexander Lourier. http://aml.rulezz.ru


Re: Обработка исключений на perl

2005-11-19 Пенетрантность Serge Olkhowik
On Thu, 17 Nov 2005 13:00:13 +0300
 Dmitry E Oboukhov (Dmitry) wrote:

 Dmitry теоретически можно написать
 Dmitry   my $result=eval {...};
 Dmitry   return $result unless ($@);
 Dmitry   ...

 Dmitry но это введение лишней переменной

Наоборот - ИМХО, это самый красивый вариант.

-- 
Serge Olkhowik (aka BaMba)
[EMAIL PROTECTED] http://www.bamba.dp.ua 2:464/[EMAIL PROTECTED] ICQ:322855162


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: Обработка исключений на perl

2005-11-17 Пенетрантность Artem Chuprina
Dmitry E. Oboukhov - debian-russian@lists.debian.org  @ Thu, 17 Nov 2005 
13:04:15 +0300:

  Потому что return - это не goto.
 DEO да это я понимаю

 DEO просто задачи: выход из (итерации) цикла внутри eval решабельны,
 DEO а выход из функции нет
 DEO вот и спрашиваю :)

А вы так не делайте (c).  Отнесись к eval как к вызову функции.  Тогда
многое станет понятнее.  В частности, почему 

return eval { ... } unless $@

работать в принципе не может ни в каком варианте.  Потом заведи
переменную и расслабься.  Если ОЧЕНЬ-ОЧЕНЬ хочется обойтись без
переменной, можно извратиться через $@, вместо return выкидывая из eval
специальный объект исключения и анализируя его потом.  Но не надо.

-- 
Artem Chuprina
RFC2822: ran{}ran.pp.ru Jabber: [EMAIL PROTECTED]

The Eclipse Platform is an open and extensible platform
for anything and yet nothing in particular.
apt-cache show eclipse-platform


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: Обработка исключений на perl

2005-11-16 Пенетрантность Anton Petrusevich
On Wednesday 16 November 2005 13:39, Dmitry E. Oboukhov wrote:

Я думаю эта программа приведёт твои мысли в порядок по поводу return из eval.

$ cat p.pl
#!/usr/bin/perl

sub exc_test
{
my $tst = shift;
my $rc = eval {
if($tst) {
return 505;
}
die;
};
if($rc == 505) {
print No shit\n;
}
if($@) {
print Shit happened\n
}
}

exc_test(0);
exc_test(1);

$ perl p.pl
Shit happened
No shit

-- 
Anton



Re: Обработка исключений на perl

2005-11-16 Пенетрантность Mikhail Gusarov

You ([EMAIL PROTECTED]) wrote:

 DEO итак, только начал его изучать ну и надо перехватить die из
 DEO некоторой библиотечной функции

Есть предложение изучить, как это делается в
http://search.cpan.org/~pjordan/Exception-1.7/Exception.pm

-- 
Mikhail Gusarov
ICQ UIN: 111575219
JID: [EMAIL PROTECTED]


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: Обработка исключений на perl

2005-11-16 Пенетрантность Artem Chuprina
Dmitry E. Oboukhov - debian-russian@lists.debian.org  @ Wed, 16 Nov 2005 
16:13:51 +0300:

  Я думаю эта программа приведёт твои мысли в порядок по поводу return из 
  eval.
 DEO гм получается что return именно из eval return
 DEO а следовательно получается если из под eval надо return из подпрограммы
 DEO то надо переменные городить :(
 DEO ладно, подумаем

 DEO тогда непонятно почему следующая конструкция работает:

 DEO cycle_name: while(бла-бла)
 DEO {
 DEO   бла-бла;

 DEO   eval 
 DEO   {
 DEO  ...
 DEO  next cycle_name if (бла-бла);
 DEO  last cycle_name if (бла-бла);
 DEO  ...
 DEO   };
 DEO }

Потому что return - это не goto.

-- 
Artem Chuprina
RFC2822: ran{}ran.pp.ru Jabber: [EMAIL PROTECTED]

У кошки четыре ноги: ввод, вывод, земля и питание.


-- 
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of unsubscribe. Trouble? Contact [EMAIL PROTECTED]



Re: Обработка исключений на perl

2005-11-16 Пенетрантность Anton Petrusevich
On Wednesday 16 November 2005 14:13, Dmitry E. Oboukhov wrote:
 гм получается что return именно из eval return
 а следовательно получается если из под eval надо return из подпрограммы
 то надо переменные городить :(
 ладно, подумаем

По моему, ты всё-таки недопонял. 

 тогда непонятно почему следующая конструкция работает:

А по этому вопросу видно что именно ты недопонял. evla умеет возвращать 
значение, примерно как программа на перле может вернуть значение (код 
возврата) и, как везде в перле, значение можно задать либо явно (return), 
либо неявно(последнее вычисленное значение). А die -- это именно исключение, 
если его ловят (оно внутри eval), то завершается блок eval аварийно, если 
нет, то завершается программа. Возможно, прочтение документации тебя 
окончательно просветит.
-- 
Anton