#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, но я все еще немного смущен тем, почему я не могу просто поймать проблему и ничего не делать (пусть код продолжается)