LINUX.ORG.RU

Самый лаконичный способ сообщить об ошибке в Mojo?

 , ,


0

2

Как сделать это?

Необходимо вернуть json с кодом и текстом ошибки, при этом завершив всю обработку запроса.

Например, что-то вроде этого:

my %Erc2HTTP=(
  101=>404,
  102=>403,
  103=>401,
  104=>404,
);
$someObj->exception(message=>'No such meteostation', code=>101);
# Обработчик исключения
sub hndlException {
 my ($c,%pars)=@_;
 $c->render(
   json=>{
     'error'=>$pars{'message'}
     'erc'=>$pars{'code'} 
   },
   code=>$Erc2HTTP{$pars{'code'}},
 );
 $c->finish();
}
В результате, после $c->finish вся обработка запроса будет завершена, никакие after_dispatch'и вызываться не будут.

Это возможно в Mojolicious?

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 2)

my %errors = (
  101 => {code => 404, message => 'No such meteostation'},
  102 => {code => 403, message => '...'},
  103 => {code => 401, message => '...'},
  104 => {code => 404, message => '...'},
);

eval {
  my ($data, $errno) = $someObj->some(..); # работа с объектом
  die("$errno\n") if $errno;
  $c->render(any => {json => $data}); 1;
} or do {
  my ($code, $msg) = exists $errors{$@} ? $errors{$@} : (400, 'unknown error');
  $c->render(any => {json => {code => $code, message => $msg}});
  exit 0; # "никакие after_dispatch'и вызываться не будут."
};

И, да, я против использования кодов http для обозначения ошибки api. Ставишь 400 и в самом ответе указываешь код ошибки вместе с message.

anonymous
()
Ответ на: комментарий от anonymous

Вопрос скорее в том, нет ли в самом Mojo адекватных средств для этого. А так можно и Try::Tiny использовать...

Кстати, так не работает :)

my ($code, $msg) = exists $errors{$@} ? $errors{$@} : (400, 'unknown error');

DRVTiny ★★★★★
() автор топика
Ответ на: комментарий от DRVTiny

Странного хочешь ты, на самом деле.

chomp $@ поставь в начале блока, там у тебя лишний перевод строки. Хотя это плохая практика - логика на исключениях.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.