Как перенаправить в проверочном блоке Mojo :: Exception? - PullRequest
1 голос
/ 30 января 2020

Допустим, у меня есть что-то вроде этого, которое работает,

eval { die "asdf" }
Mojo::Exception::check(
    default => sub { die 42 }
);

Но я хочу что-то вроде этого ..

eval { die "asdf" }
Mojo::Exception::check(
    default => sub { $c->redirect_to("https://google.com") }
);

Я считаю, что даже до завершения $c->redirect_to что ничего не происходит. Более того, если я сделаю что-то вроде

eval { die "asdf" }
Mojo::Exception::check(
    default => sub { $c->redirect_to("https://google.com"); die 42; }
);

, что оно все еще умирает.

Так что в обычном коде я могу сделать

return $c->redirect_to("https://google.com");

, который будет работать, но как сделать это внутри звонка на Mojo::Exception::check

Ответы [ 2 ]

2 голосов
/ 30 января 2020

Я бы предпочел использовать Синтаксис :: Keyword :: Try для перехвата исключений. Это решает эту проблему, потому что он не переносит обработчик исключений в подпрограмму, поэтому вы можете просто вернуться, а также по умолчанию избежать проблемы , полагаясь на истинность $@.

use strict;
use warnings;
use Syntax::Keyword::Try;

sub ... {
  try { die "asdf" }
  catch { return $c->redirect_to("https://google.com"); }
}
1 голос
/ 30 января 2020

Я обошел это, добавив,

return $c if $c->res->is_redirect

Как это,

eval { die "asdf" }
Mojo::Exception::check(
    default => sub { $c->redirect_to("https://google.com"); }
);
return $c if $c->res->is_redirect;

Также,

09:16 < kraih> EvanCarroll: best is probably "return if $c->res->code;"
...