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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват вызовов несуществующих процедур, Особенности работы AUTOLOAD 
:(
    Опции темы
Ramirez
Дата 26.5.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 305
Регистрация: 18.1.2005
Где: Moscow, ExUSSR

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



Столкнулся с необходимостью перехватывать если вызвана процедура не определенная в данном модуле. Попробовал сделать с помощью функции AUTOLOAD - не работает. Никак не пойму почему.

Есть модуль:
Код

package My::Mod;

use strict;

sub AUTOLOAD {
    use vars qw($AUTOLOAD);
    return "Function $AUTOLOAD not exist"
}


Вызываю таким способом:
Код

....
$result = eval("use My::Mod; My::Mod::$function_name;");
$result = $@ if $@;
return $result;
...


И  все равно пишет: Bareword "....." not allowed while "strict subs" in use at (eval 10) line 1.  
PM ICQ   Вверх
korob2001
Дата 27.5.2006, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

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



Так а зачем тебе перехватывать ошибку, если у тебя есть AUTOLOAD, по сути она это делает за тебя? В твоём случае eval не перехватывает ошибки, так как на самом деле её и нет, просто вместо несуществующего метода запускается AUTOLOAD который возвращает строку.
Насколько я понял, ты хочешь предотвратить аварийное завершение программы, если был вызван не существующий метод, с выводом сообщения об этом. Если да, то можно сделать так:
Код
package My::Mod;

use strict;

AUTOLOAD {
    use vars qw($AUTOLOAD);
    warn "Function $AUTOLOAD not exist"
}

1;

Здесь изменился только return на warn, так как если мы будем возвращать строку, то потом не сможем отличить её от того, что мог бы вернуть метод My::Mod::test(), если бы он существовал, от сообщения об ошибке.

Код
#!/usr/bin/perl -w
use strict;
use My::Mod;
My::Mod::test();

Как видешь мы ничего не пропускали через eval и программа всё равно отрабатывает без аварийного завершения, правда с выводом предупреждающего сообщения.

Если же ты хочешь перехватить ошибку с помощью eval, тогда нужно убрать AUTOLOAD и пропустить вызов метода через eval.
Код
package My::Mod;

use strict;

1;

Основной код:
Код
#!/usr/bin/perl -w
use strict;
use My::Mod;

eval { My::Mod::test() };
warn "Fuck: $@\n" if $@;

print "Last string\n";

Здесь последняя строка нужна для того, что бы показать, что программа лишь предупреждает тебя и продолжает свою работу. Если же не перехватить ошибку, то программа завершит свою работу ещё при вызове несуществующего метода и разумеется последней строки ты не увидешь.
Код
#!/usr/bin/perl -w
use strict;
use My::Mod;

My::Mod::test();

print "Last string\n";
 


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


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

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


 




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


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

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