Почему катализатор не умирает только один раз в цепном действии? - PullRequest
1 голос
/ 02 марта 2011

Рассмотрим следующие действия:

sub get_stuff :Chained('/') :PathPart('stuff') :CaptureArgs(1) {
  my ($self,$c,$stuff_id) = @_;
  die "ARRRRRRGGGG";
}

sub view_stuff :Chained('get_stuff') :PathPart('') :Args(0){
  die "DO'H";
}

Теперь, если вы запросите '/ stuff / 314 /', вы получите

Error: ARRRRG in get_stuff at ...

Error: DO'H in view_stuff at ...

Есть ли причина, по которой нельзя просто сгенерировать ошибку при первом сбойном звене цепи?

Почему катализатор пытается удержать цепь?

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

Я не уверен в ответе на вопрос «почему», но я предполагаю, что это было сделано таким образом, чтобы придать гибкость.

Вероятно, вы должны отловить ошибку с помощью eval (или, желательно, что-то вроде Try :: Tiny или TryCatch ) и вызвать $c->detach, если вы хотите прекратить обработку действий.

1 голос
/ 08 апреля 2014

Выбранный ответ может быть устаревшим.Catalyst может умереть рано, когда установлен ключ конфигурации приложения abort_chain_on_error_fix.

__PACKAGE__->config(abort_chain_on_error_fix => 1);

См. Документацию о Конфигурации Catalyst .В нем также говорится, что это поведение может быть стандартным в будущем.

1 голос
/ 05 октября 2011
0 голосов
/ 20 марта 2011

Cucabit прав, отрыв - это путь. Что касается того, почему, обычно в perl-процессе, «die» останавливает процесс. В Catalyst вы этого не хотите. Например, если вы запускаете приложение Catalyst под FastCGI, вы создаете один или несколько автономных процессов, которые обрабатывают несколько запросов. Если первый запрос уничтожит сам процесс, веб-сервер должен будет повторно запустить процесс FastCGI, чтобы иметь возможность обрабатывать следующий вызов. Я думаю, что для этого Catalyst ловит «die» (он часто используется как «do_something () или die $!» По умолчанию) и превращает его в исключение.

Полагаю, вы могли бы также завершить процесс с помощью команды «exit», но у вас возникли те же проблемы, что и выше, убив процесс. Конечно, вы можете создать свой собственный метод die, который регистрирует ошибку, переданную с помощью объекта журнала по умолчанию, а затем вызывает detach или что-то в этом роде. также должна быть возможность переопределить обработку исключений Catalyst, так как все возможно с Catalyst:)

...