Умереть как автоди

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

Если это поможет, я использую Moose строить мои классы

2 ответа

Решение

Если вы хотите, чтобы ваши исключения были такими же, как в 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 исключения для обеспечения стековых трассировок, локализации или других функций.

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

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

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

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

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

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

Другие вопросы по тегам