| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
Вообще язык позволяет нечто вроде:
Но конкретных примеров как с этим работать в кемелбуке нету. И, возможно есть устоявшися базовый класс для обьектов исключений? |
| Автор: 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 ошибку без номера строки. Пришлось дорабатывать напильником:
Это нормально, или надо просто опцию какую-то включить? Еще попробовал Exception::Base. Какой класс лучше использовать, Exception::Base или Exception::Class::Base? |
| Автор: sir_nuf_nuf 22.2.2010, 11:34 | ||
| вроде Error наиболее популярный. Кстати могу предостеречь вас от одно ошибки.. В конструкциях вида
нужно всегда ставить точку с запятой в конце. т.к. try - это вызов функции, catch - тоже. а последний блок - на самом деле просто аргумент функции. если не поставить точку с запятой - catch может прихватить следующее выражение как аргумент. Это приводит к ошибкам. Просто кошмарным =) |
| Автор: Logo 23.2.2010, 16:20 |
| Класс исключений в Error простоват. Остановился на Exception::Base. |