Продолжайте пузыриться внутри цикла в переполнении стека

Я адаптировал веб-скрипт, который написал для своих нужд, для некоторых данных, которые мне нужно получить с сервера. Я запускаю этот скрипт из терминала, поэтому сообщения об ошибках являются полезной информацией.

Основная часть кода представляет собой цикл внутри цикла, и в этом цикле я вызываю функцию. В этой функции есть вызов к базе данных. Если есть проблема с подключением к базе данных, я могу поймать эту ошибку с помощью простого try {} catch(){}, но как я должен структурировать свой код так, чтобы я мог просто пропускать эту итерацию и перейти к следующему элементу в цикле? Другими словами, сделать continue только изнутри функции.

Ниже описано, как я это сделаю, но я не уверен, что это правильный путь.

foreach ($flavours as $icecream) {
foreach ($sauces as $sauce) {
$amount = dessertServings($icecream, $sauce);
if ($amount != null) {
// Some other functions like orderDessert, makePricingList and so on
fwrite(STDOUT, "$amount servings of $icecream with $sauce remaining!\n");
}
}
}

dessertServings($icecream, $sauce) {
try {
$dbConnection = new Connection("user", "password", "db$icecream$sauce");
$amountOfServings = $dbConnection->query($icecream, $sauce);
return $amountOfServings;
}
// E.g database connection could not be made
catch(Exception $e) {
fwrite(STDERR, $e->getMessage() . "\n");
return;
}
}

Есть лучший способ сделать это?

Чтобы сделать вещи сложнее, Что делать, если функция на самом деле ничего не возвращает и, следовательно, не присваивает значение переменной? Как с этим бороться?

foreach ($flavours as $icecream) {
foreach ($sauces as $sauce) {
prepareDessert($icecream, $sauce);
// Other functions, most importantly: eatDessert($dessert)
}
}

prepareDessert($icecream, $sauce) {
try {
$dbConnection = new Connection("user", "password", "db$icecream$sauce");
$dbConnection->query($icecream, $sauce)->do("prepare");
}
// E.g database connection could not be made
catch(Exception $e) {
fwrite(STDERR, $e->getMessage() . "\n");
}
}

В таком случае, как мне убедиться, что когда try не удается, блок в цикле никогда не достигает другие функции, мы не можем есть мороженое, которое не было приготовлено в первую очередь!

Буду ли я использовать пустую переменную, которая просто возвращает true при успехе и false и fail, и выполнять следующий код в главном блоке только при true? Или есть лучшее соглашение для этого в PHP?

0

Решение

как я должен структурировать свой код так, чтобы я мог просто пропустить эту итерацию и перейти к следующему элементу в цикле

Первое правило обработки исключений: не делайте обработку исключений. Позвольте этому пузыриться и поймайте это, когда вам это нужно (в вашем случае, в вашей петле).

Вы также можете повторно выдать исключение в своем улове, если вы хотите выполнить некоторую обработку внутри функции (например, печать в STDERR), но пусть она всплывает!

Другой, более традиционный метод — заставить вашу функцию возвращать какой-то код ошибки. Самым основным является «true» в случае успеха, «false» или «null» в случае сбоя, как в первом примере. Я не вижу в этом ничего плохого.

Что еще сложнее, что если функция на самом деле ничего не возвращает и, следовательно, не присваивает значение переменной? Как с этим бороться?

Бросайте исключения, это их работа!

Как мне убедиться, что когда попытка не удалась, блок в цикле никогда не достигает других функций

Не пытайтесь поймать / перехватить внутри функции или повторно выдать исключение из вашей «ловушки».

Буду ли я использовать пустую переменную, которая просто возвращает true при успехе и false и fail, и выполнять следующий код в главном блоке только при true? Или есть лучшее соглашение для этого в PHP?

Да, есть лучшее соглашение: выбросить исключения.

0

Другие решения

Других решений пока нет …