Поведение функций модификатора роли лося - PullRequest
1 голос
/ 23 декабря 2011

Учитывая приведенный ниже пример кода, при запуске Main :: main, если происходит сбой блока eval, я бы предположил, что блок 'after' в роли никогда не запустится. Тем не менее, я нахожусь в процессе отладки периодической и сложной ошибки, которая может указывать на то, что это не так.

Может ли кто-нибудь объяснить, как работает процесс «выравнивания» в этом контексте, и есть ли какие-либо условия, при которых eval не будет работать, но будет работать блок after?

Спасибо Джош

package MyRole;
use Moose::Role;

after 'main' => sub {
    #some code that depends on main executing
};

package Main;
use Moose;
with 'MyRole';

sub main {
    eval {
        #main work
    };
    if ($@) {
        die 'what happens now?';
    }
}

Ответы [ 2 ]

2 голосов
/ 23 декабря 2011
  • MyRole :: main () обычно выполняется после Main :: main ().

  • Они не совсем сведены в один метод с одним последругое в том, что то, что вы возвращаете в Main :: main (), остается тем, что возвращается, и все, что вы возвращаете в MyRole :: main (), игнорируется.

  • Если «главная работа» завершается неудачей, MyRole :: main () не будет выполняться, так как вы также умрете в блоке catch (if $@), что означает, что поток выполнения умирает до того, как достигнет MyRole :: main ().

2 голосов
/ 23 декабря 2011

Если main умрет, модификатор after не запустится.Тем не менее, eval может потерпеть неудачу, а $@ может быть ложным.Похоже, это должно быть то, что здесь происходит.Если eval завершится неудачно, но $@ будет ложным, ваш код обработки ошибок не будет запущен и main не выдаст исключение.Таким образом, будет запущен код после main.

Это одна из вещей, от которой Try :: Tiny защищает вас.

...