Почему Throwable catch игнорирует ‘continue’, но работает с ‘return’?

#php #try-catch #throwable

#php #попробуйте-catch #throwable

Вопрос:

У меня есть следующий код:

 foreach ($inDomainLinks as $href) {
    try {
        $page->goto($href, ['waitUntil' => 'networkidle2']);
    } catch (Throwable $exception) {
        continue;
    }
}
  

Я бы хотел, чтобы в случае сбоя кода внутри Try мы переходили к следующему значению в цикле.

Однако приведенный выше код в любом случае выдает ошибку, и выполнение завершается.

Если я попытаюсь сделать это, например:

 foreach ($inDomainLinks as $href) {
    try {
        $page->goto($href, ['waitUntil' => 'networkidle2']);
    } catch (Throwable $exception) {
        return $href.' fails';
    }
}
  

Это на самом деле возвращает это значение, так что я действительно добираюсь до catch, но я просто не знаю, почему первый код выполняется не так, как задумано (мной).

Есть идеи?

Пока что моим обходным путем является создание частной функции, которая оборачивает try catch:

 foreach ($inDomainLinks as $href) 
    $this->analyzePage($page,$href);

private function analyzePage($page,$href){
    try {
        $page->goto($href, ['waitUntil' => 'networkidle2']);
        return true;
    } catch (Throwable $exception) {
        return false;
    }
}
  

Комментарии:

1. Пожалуйста, предоставьте больше контекста. Цикл должен продолжать повторяться просто отлично. Обратите внимание, что continue в этом случае это бесполезно, вы в основном просто отключаете исключение.

2. Я добавил continue , что если я оставляю catch пустым, он выдает исключение и не перехватывает его. Мне пришлось включить вспомогательную функцию для обработки этого, которая работает. Не уверен, почему try catch заставляет меня включать оператор return

Ответ №1:

Если он выдает ошибку, то вы не улавливаете правильную ошибку. Там будет работать continue, и, честно говоря, это избыточно, поскольку код все равно будет запущен.

Комментарии:

1. Если я удаляю continue, это также выдает ошибку и завершает код — catch работает, только если я помещаю return внутрь

2. Можете ли вы опубликовать ошибку и тип ошибки, потому что я думаю, что вы улавливаете неправильную ошибку.

3. SymfonyComponentProcessExceptionProcessFailedException: The command "node C:xampphtdocsgdprnode_modules@neskrialtosrcnode-processserve.js C:xampphtdocsgdprvendorneskpuphpeteersrcPuppeteerConnectionDelegate.js "{""idle_timeout"":60,""log_node_console"":false,""log_browser_console"":false}"" failed. Throwable должен обрабатывать все, не так ли?

4. Можете ли вы попробовать поставить Exception вместо Throwable

5. Я сделал то же самое — я решил это, включив try catch в другую закрытую функцию, которая возвращает true или false, но я все еще немного смущен тем, почему я не могу просто поймать проблему и ничего не делать (пусть код продолжается)