Работа с пространственной асинхронной обработкой ошибок - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над асинхронным процессом над проектом PHP. Я использую библиотеку с именем "spatie". Фрагмент кода, как показано ниже:

foreach (range(1, 2) as $i) {
    $pool->add(function () use ($i) {
        // Do a thing
        try {
            $result = $i / 0; // This will cause an error
            return "Works";
        } catch (\Exception $e) {
            return -1;
        }
    })->then(function ($output) {
        // Handle success
        echo (output . "\n");
    })->catch(function ($exception) {
        // When an exception is thrown, it's caught and passed here.
        echo "Sounds good, but don't work\n";
    })
}

$pool->wait();

Все, что я хочу, - это когда $result получил ошибку, он войдет во внутренний catch, но вместо этого он опустится до нижнего улова, что приведет к отличному результату от того, что я хочу.

Результат, который я хочу получить:

-1

-1

Но вместо этого результат:

Звучит хорошо, но не работает

Звучит хорошо, но не работает

Может кто-нибудь помочь мне добиться результата так, как я хочу?

1 Ответ

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

Проблема вашего кода в том, что он не генерирует исключение при вызове метода add.Деление на 0 просто вызывает ошибку, но не исключение.Вместо того, чтобы менять весь обработчик ошибок php, я предлагаю немного расширить вашу логику в вызове метода add.

$divisor = 0;
$pool->add(function() use ($i, $divisor) {
    try {
        if ($divisor === 0) {
             throw new \LogicException('Division by zero!');
        }

        return $i / $divisor;
    } catch (\LogicException $e) {
        return -1;
    }
});

Другим решением может быть изменение обработки ошибок для вызова метода пула.

set_error_handler(function () {
    throw new \LogicException('Ouch!');
});

$pool->add(function() use ($i) {
    try {
        $result = $i / 0;
    } catch (\LogicException $e) {
        return -1;
    }
});

restore_error_handler();

Внимание!Изменение обработчика ошибок влияет на все предстоящие ошибки.Даже ошибки в вашей используемой библиотеке.Имейте в виду, что это фрагменты кода.Это не проверено и не может быть использовано в производстве.Надеюсь, это немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...