anonymous@RULINUX.NET~# Last login: 2020-10-31 10:35:49
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]

Локализация $@ в DESTROY

Скрыть

Недавно обнаружил, что локализовывать переменную $@ в DESTROY методе бывает очень полезно. Даже, похоже, сабж можно поместить в мануал как best practice (или я невнимательно читал мануалы, и там такое уже есть?). Без лишних слов:

perl

#!perl -w
 
use strict;
use warnings;
 
package Animal;
 
sub new
{
            my $class = shift;
            return bless { 'a' => shift, }, ref($class) || $class;
}
 
sub moo
{
            my $self = shift;
 
            print "$self->{'a'} says: moo\n";
}
 
sub DESTROY
{
            my $self = shift;
            eval { $self->moo; };
}
 
1;
 
package main;
 
eval {
            my $a = Animal->new('Cow');
            $a->bark;
};
 
if ($@)
{
            print "Cow cannot bark\n";
} else {
            print "Cow can bark\n";
}

 

Программа выведет: Cow says: moo Cow can bark

Ну, наверное, вам уже стало понятно почему корова может гавкать?! Тут всё довольно просто и прозрачно. А вот диагностировать подобную проблему в сложной системе с кучей используемых модулей и фреймворков довольно сложно. На это можно убить даже не несколько часов, а несколько дней. Так что, рекомендую локализовывать $@ в DESTROY методе ваших классов.

По этой же причине значению, которое вернул eval, вообще нельзя доверять (ты же не контролируешь код всех модулей, которые используешь), и стоит использовать Try::Tiny или что-то подобное.

(с) этот текст - найденная на просторах интернета копипаста

vilfred(*) (2011-06-01 22:31:00)


Подтверждено: vilfred(*) (2011-06-01 22:31:00)

[Оставить комментарий к статье]
Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!