Как обрабатывать ошибки в задержке ответа - PullRequest
1 голос
/ 05 июля 2019

Пытался обработать ошибки в задержанном ответе.

Каждый раз, когда я отправляю [200, ['Content-Type', 'application / json'] и получил ошибку, прежде чем сбрасывать другие вещи, как это

$ w-> запись ( "MyData");

$ w-> близко ();

У меня предупреждение в stdout и ошибка в stderr, но страница продолжает загружаться.

он будет загружаться до тех пор, пока я не остановлю приложение или вручную не остановлю загрузку страницы.

как мне остановить загрузку страницы в коде или как правильно обрабатывать ошибки в таких приложениях, где я использую отложенный ответ?

Perl версия 5.24 Келп версия 1.02 Бег Плак с Короной.

Мы обрабатываем сообщение об ошибке Exception :: Class. Перехват ошибок с помощью Try :: Tiny.

Также пробовал eval и другие вещи, но это не работает. Но изменил Try :: Tiny -> TryCatc и вернусь, если получил какую-либо ошибку, но мне нужно написать return для каждого блока catch, это выглядит очень плохо

#!/usr/bin/perl
use strict;
use warnings;

use Kelp::Less;
get '/hello' => sub  {
    return sub {
        my $res = shift;
        my $w = $res->([200, [ 'Content-Type', 'application/json' ]]);
        my $data = 10 / 0;
        $w->write("MyData");
        $w->close();
    }
};
run;

Я ищу правильную обработку ошибок, мне нужно попробовать {} catch {}; на каждый код, который может дать сбой?

Спасибо @ikegami за ответ, но страница все еще загружается после попыток с Object :: Destoyer и Sub :: ScopeFinalizer. Как я понимаю, $ w (писатель) не вызывает загрузку страницы. После выхода из области видимости, $ w приходит undef, и закрывать нечего, вот код.

#!/usr/bin/perl
use strict;
use warnings;

use Object::Destroyer;
use Kelp::Less;
get '/hello' => sub  {
    return sub {
        my $res = shift;

        my $w = $res->([200, [ 'Content-Type', 'application/json' ]]);
        my $g = Object::Destroyer->new( sub { $w->close if $w } );
        my $zzz = 1 / 0;
        $w->write("DATA");
        $w->close();
    }
};
run;

так что я придумала это решение, как вы думаете?

#!/usr/bin/perl
use strict;
use warnings;

use Try::Tiny;
use Object::Destroyer;
use Kelp::Less;
get '/hello' => sub  {
    return sub {
        my $res = shift;

        my $w = $res->([200, [ 'Content-Type', 'application/json' ]]);
        my $g = Object::Destroyer->new( sub { $w->close if $w; } );
        my $ans = try {                                                                   
            my $zzz = 1 / 0;                                                              
        }                                                                                 
        catch {
            print $_;                                                                   
            return;                                                                       
        };                                                                                
        return unless $ans;

        $w->write("DATA");
        $w->close();
    }
};
run;

1 Ответ

1 голос
/ 12 июля 2019

Решите эту проблему с помощью приложения-оболочки с

Plack::Middleware::HTTPExceptions
...