умереть как автоди - PullRequest
2 голосов
/ 14 мая 2011

Я использую autodie для обработки исключений из встроенных модулей. К сожалению, его область применения лексическая, autodie не работает с методами. Можно ли генерировать исключения из моих методов класса, чтобы они обрабатывались так же, как исключения autodie. Короче говоря, я не хочу, чтобы пользователи моих классов обрабатывали исключения двумя способами: один с расширенным классом исключений, который autodie предоставляет для встроенных модулей, и другой для простого «die if ...», который генерирует мой код.

Если это поможет, я использую Moose для создания своих классов

Ответы [ 2 ]

2 голосов
/ 20 мая 2011

Если вы хотите, чтобы ваши исключения были такими же, как в autodie, то я могу придумать два варианта:

Использовать или наследовать от autodie::exception класса.

Это довольно просто, просто perldoc autodie::exception и обратите внимание, какие аргументы ему нужны при создании новых объектов. Вы можете обнаружить, что наследование от autodie::exception предоставляет вам больше гибкости или функциональности, и в этом случае вам следует это сделать.

Скажите autodie, чтобы использовать собственный класс исключений.

Это немного сложнее, но не так сложно:

# Inside my/autodie.pm

pacakge my::autodie;
use parent 'autodie';

sub exception_class { return 'my::exception::class'; }

1;

Затем вы можете использовать my::autodie в своем коде (с лексической областью действия), но всякий раз, когда он генерирует исключение, он создает и выбрасывает объект из my::exception::class, а не из autodie::exception. Это, вероятно, излишне для того, что вы хотите, но очень удобно, если вы хотите, скажем, расширить autodie исключения для обеспечения возврата в стек, локализации или других функций.

2 голосов
/ 15 мая 2011

Глядя на источник autodie, я вижу, что он умирает, используя:

    Carp::croak sprintf(
        ERROR_WRONG_FATAL, $Fatal::VERSION, $VERSION, $autodie_path
    );

Если вы сделаете то же самое из своего кода, я ожидаю, что вызывающий код получит что-то, выглядящее както же самое.

Редактировать: Как указано в комментариях к этому ответу, autodie фактически умирает изнутри Fatal.Пятиминутный взгляд на источник Fatal не позволил выяснить, как / где он умирает, в основном просто из-за этого я запутался в связи между двумя модулями. [1]

Если толькоЕсли вы хотите покопаться в источнике Fatal, следующий вариант - определить, какие функции исключений autodie важны для вас, и продублировать их.Исходя из этого, звучит так, что это может быть так же просто, как определить класс исключений, используемый autodie, и выбросить объекты исключений этого же класса.

[1] Fatal имеет много «use autodie»вместо этого, потому что он делает то, что Fatal не "комментирует, но autodie, по-видимому, делегирует почти все Fatal, так что может показаться, что то, что autodie делает, а Fatal - это все еще на самом делесделано Fatal ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...