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


Автор: Logo 20.2.2010, 14:11
Есть ли какой нибудь общепризнанный базовый класс-исключение для Perl, для создания объектов-исключений? Как вообще нужно работать с исключениями?

Автор: vadiml 20.2.2010, 15:05
Всё что я видел фактически использовало что-то типа
eval{  
# разный код
die 'error1';
};
if ( $@ && $@ eq 'error1' ) {
   наша ошибка
}
elsif ( $@ ) {
   неизвестная ошибка
}

Но если очень хочется класс, поищите на сpan-е по "exeption"

Автор: Logo 20.2.2010, 15:20
Вообще язык позволяет нечто вроде:
Код

eval {
  $@ = My::ExeptionClass;
  die; 
}
if($@) {
  die $@; #умираем с сообщением My::ExeptionClass->PROPAGATE;
}


Но конкретных примеров как с этим работать в кемелбуке нету. И, возможно есть устоявшися базовый класс для обьектов исключений?

Автор: mvsgt 20.2.2010, 16:16
Так всё просто. die возвращает либо просто строку, либо объект. Если объект - анализируете его тип. 
Конкретных примеров в CPAN много. 
http://search.cpan.org/search?query=exception&mode=module

Автор: Logo 20.2.2010, 16:47
У меня есть класс, с которым связано 3 основных типа ошибок. Должен ли я на каждый тип ошибки создать свой класс исключения, или создать один класс со свойством type?

Автор: DurRandir 20.2.2010, 17:15
1. Общепринятого - нет. Как и общепринятого try/catch модуля.
2. eval{...} + if ($@) - это плохо. Если по результатам eval будет вызван деструктор для созданного внутри объекта, то в $@ может быть далеко не то, что ожидается. Гораздо лучше отлавливать ошибку как-то так:
eval{...; 1} or do {...}


Я лично, если решаю в скрипте ловить исключения, делаю для каждого свой класс, наследующий от Exception::Class::Base с переопределённым _initialize.

Автор: Logo 21.2.2010, 22:24
Попробовал Exception::Class::Base. Он почему-то выводит на STDERR ошибку без номера строки. Пришлось дорабатывать напильником:
Код

sub MyException::PROPAGATE {
  my $self = shift;
  $self->message() . " at " . $self->file . " line " . $self->line . ".";
}

sub MyException::throw {
  my($class, %args) = @_;
  $@ = $class->new(%args);
  die;
}


Это нормально, или надо просто опцию какую-то включить? Еще попробовал Exception::Base.
Какой класс лучше использовать, Exception::Base или Exception::Class::Base?

Автор: sir_nuf_nuf 22.2.2010, 11:34
вроде Error наиболее популярный.

Кстати могу предостеречь вас от одно ошибки..
В конструкциях вида
Код

try { 
    # bla
}
catch {
    # bla
};

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

Это приводит к ошибкам. Просто кошмарным =)


Автор: Logo 23.2.2010, 16:20
Класс исключений в Error простоват.
Остановился на Exception::Base.

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