2015-05-25 5 views
1

мой вопрос в том, НАДЕЖНО простой., объявляющие глобальные подпрограммы perl или глобальные псевдонимы

В Perl, как создать глобальную подпрограмму, доступную для всех объектов после этого?

sub throw 
{ 
    die(shift); 
} 

Кажется, что он работает в глобальном масштабе, но впоследствии не доступен для пакетов. Я хотел бы избежать делать что-то вроде объявления в каждом объекте в стеке приложений.

Боковое решение: как создать псевдоним для глобального ключевого слова, например, умереть?

Обратите внимание: мне все равно, что делать что-то подобное считается лучшей практикой. Хотя они выполняют одну и ту же функцию в Perl, die не бросает, а бросок не умирает. Следующий синтаксис не следовать принципам объектно-ориентированного программирования, что я пытаюсь следовать:

die new Exception($message); 

Однако логически подобное, с целью бросать исключения, я бы предпочел синтаксис:

throw new Exception($message); 

Огромное спасибо сообществу stackoverflow!

+1

Пожалуйста, не пишите 'новый Classname'. В Perl 'new' - это просто имя метода, а не ключевое слово, и оно может запутать интерпретатор. Вместо этого используйте 'Exception-> new ($ message)'. –

ответ

2

Вы можете добавить throw в пакет UNIVERSAL (что не очень удобно).

Обратите внимание, что ваш throw игнорирует сообщение и отображает только имя класса.

#!/usr/bin/perl 
use warnings; 
use strict; 

{ package UNIVERSAL; 

    sub throw { die shift } 
} 

{ package MyClass; 

    sub new { bless {}, shift } 
} 

my $c = 'MyClass'->new; 
$c->throw('Ouch!'); 

См. Try::Tiny.

+0

Очень интересно! Мне нравится идея! Это определенно централизует его. Я предполагаю, что нет способа сделать это только в средствах, которые позволяют мне использовать синтаксис «throw new someObj()» случайно? BTW, я искал, как это сделать раньше. Иногда Perldocs немного расплывчато. – steve

+0

Другое примечание, я думаю, я добавлю его выше. Мое намерение - бросить ссылки на блаженные объекты исключений. Надеюсь, что я смогу хранить в них всю полезную информацию, такую ​​как трассировка стека. Еще раз спасибо! – steve

+0

@steve: 'die' может создавать объекты исключений. – choroba

1

Как насчет такой парадигмы, которая позволила бы сразу решить ваши проблемы?

package Exception; 

sub throw { 
    my $message = shift; 
    die Exception->new($message); 
} 

sub new { 
    # whatever 
} 

... 

А потом в какой-либо пакет, который вы можете использовать его таким образом:

package SomeClass; 

sub do_something { 
    ... 
    if ($error) { 
    Exception->throw($message); 
    } 
} 
Смежные вопросы