Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl исключения 
:(
    Опции темы
Logo
Дата 20.2.2010, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Есть ли какой нибудь общепризнанный базовый класс-исключение для Perl, для создания объектов-исключений? Как вообще нужно работать с исключениями?
PM MAIL   Вверх
vadiml
Дата 20.2.2010, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 27.7.2007

Репутация: 5
Всего: 7



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

Но если очень хочется класс, поищите на сpan-е по "exeption"
PM MAIL Jabber   Вверх
Logo
Дата 20.2.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Вообще язык позволяет нечто вроде:
Код

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


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

Это сообщение отредактировал(а) Logo - 20.2.2010, 15:23
PM MAIL   Вверх
mvsgt
Дата 20.2.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 209
Регистрация: 27.3.2009

Репутация: 1
Всего: 1



Так всё просто. die возвращает либо просто строку, либо объект. Если объект - анализируете его тип. 
Конкретных примеров в CPAN много. 
http://search.cpan.org/search?query=except...amp;mode=module
PM MAIL   Вверх
Logo
Дата 20.2.2010, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



У меня есть класс, с которым связано 3 основных типа ошибок. Должен ли я на каждый тип ошибки создать свой класс исключения, или создать один класс со свойством type?
PM MAIL   Вверх
DurRandir
Дата 20.2.2010, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



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


Я лично, если решаю в скрипте ловить исключения, делаю для каждого свой класс, наследующий от Exception::Class::Base с переопределённым _initialize.
PM   Вверх
Logo
Дата 21.2.2010, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Попробовал 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?
PM MAIL   Вверх
sir_nuf_nuf
Дата 22.2.2010, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



вроде Error наиболее популярный.

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

try { 
    # bla
}
catch {
    # bla
};

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

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




--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
Logo
Дата 23.2.2010, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 694
Регистрация: 22.7.2008

Репутация: 3
Всего: 10



Класс исключений в Error простоват.
Остановился на Exception::Base.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.