Умереть как автоди
Я использую 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
...