Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > eval


Автор: gcc 29.7.2009, 04:16
для чего нужен eval в веб программировании, можно ли его не использовать?

в одном проекте на Catayst часто видел везде стоит eval, ну и модули сделаные с die

например 

Код

if (!$c->check_user_roles('moder')  && eval{$c->user->{user}->{id} == $id})


если написать без eval, то выдаст ошибку

я пишу так 

Код

if (!$c->check_user_roles('moder')  && $c->user_exists() && $c->user->{user}->{id} == $id})



eval это просто как стиль программирование, или его нужно использовать?


Автор: chorny 29.7.2009, 04:27
В данном случае eval - это перехват исключения. Во многих языках используется try {} catch {}. В Perl такая конструкция возможна с помощью Error.pm или TryCatch.pm.

Автор: gcc 29.7.2009, 04:42
то есть можно не использовать eval?

try {} v catch {} знаю, но тут не системное программирование, то есть я не пишу фремфорк, в веб программу, все модули  и все методы должны быть на месте, не может быть что их не будет

почему нельзя нормально пользователю выдать, например

Код

if (!$id) {
  $c->stash->{error} = 1;
  $c->detach();    
....
}

Автор: Ramirez 29.7.2009, 08:52
ну собственно основная идея - это выполнить кусок кода (например динамически сформированного) на этапе исполнения. т.е. интерпретация произойдет только тогда, когда исполнение дойдет до этой строки. А применение может быть различным.

использовать или не использовать зависит от ситуации. 
Есть реальная вероятность что в вызываемом модуле/функции произойдет ошибка? Эту ошибку можно/нужно игнорировать?

1. возможность перехватывать любые ошибки в процессе исполнения
Код

eval 'die()';
warn $!;
warn 'Life after die...';


2. на этапе исполнения подключать модули по мере необходимости. а не все сразу в момент интерпретации.
Код

eval 'use Something;' if ...;


3. позволяет динамически сформировать кусок кода и выполнить его:
Код

my $a = 'print';
my $b = '$c'
my $str = $a.$b;
my $c = 123;
eval $str;



Автор: gcc 30.7.2009, 00:27
ок, понтяно

Автор: Bulat 30.7.2009, 12:28
больше всего мне eval нравится как обработчик исключительных ситуаций(ошибок). Кстати в языке Java блок try {} catch {} - просто необходимая часть кода.

Очень удобно, когда бизнес-логика проекта включает в себя ряд манипуляций на разном уровне, в коде, на уровне БД и т.д. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)