Re: Обработка исключений на perl
В сообщении от Среда 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
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
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
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
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
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
On Wednesday 16 November 2005 14:13, Dmitry E. Oboukhov wrote: гм получается что return именно из eval return а следовательно получается если из под eval надо return из подпрограммы то надо переменные городить :( ладно, подумаем По моему, ты всё-таки недопонял. тогда непонятно почему следующая конструкция работает: А по этому вопросу видно что именно ты недопонял. evla умеет возвращать значение, примерно как программа на перле может вернуть значение (код возврата) и, как везде в перле, значение можно задать либо явно (return), либо неявно(последнее вычисленное значение). А die -- это именно исключение, если его ловят (оно внутри eval), то завершается блок eval аварийно, если нет, то завершается программа. Возможно, прочтение документации тебя окончательно просветит. -- Anton