Я справляюсь с этим, возвращая нулевой объект в точке сбоя.Этот объект отвечает на каждый метод, просто возвращая себя, так что он продолжает делать это, пока не сожрет оставшиеся методы.В конце вы смотрите в $x
, чтобы увидеть, ожидаемый ли это результат или этот нулевой объект.
Вот пример такой вещи:
use v5.12;
package Null {
my $null = bless {}, __PACKAGE__;
sub AUTOLOAD { $null }
}
Для каждого вызванного метода, AUTOLOAD перехватывает его и возвращает пустой объект.
Когда вы сталкиваетесь с ошибкой, вы возвращаете один из этих нулевых объектов.В середине цепочки методов вы по-прежнему получаете объект обратно, поэтому Perl не взрывается при вызове следующего метода.
sub get_other_obj {
...;
return Null->new if $error;
...;
}
В конце цепочки вы можете проверить, что вы вернуличтобы увидеть, если это нулевой объект.Если это то, что вы получили, случилось что-то плохое.
Это основная идея.Вы можете улучшить класс Null, чтобы он запомнил сообщение и место его создания, или добавить некоторые полиморфные методы (например, sub is_success { 0 }
), чтобы он хорошо работал с интерфейсами объектов, которые вы ожидали получить.
Я думал, что где-то долго писал об этом, но сейчас не могу найти.