Я адаптировал веб-скрипт, который написал для своих нужд, для некоторых данных, которые мне нужно получить с сервера. Я запускаю этот скрипт из терминала, поэтому сообщения об ошибках являются полезной информацией.
Основная часть кода представляет собой цикл внутри цикла, и в этом цикле я вызываю функцию. В этой функции есть вызов к базе данных. Если есть проблема с подключением к базе данных, я могу поймать эту ошибку с помощью простого 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?
как я должен структурировать свой код так, чтобы я мог просто пропустить эту итерацию и перейти к следующему элементу в цикле
Первое правило обработки исключений: не делайте обработку исключений. Позвольте этому пузыриться и поймайте это, когда вам это нужно (в вашем случае, в вашей петле).
Вы также можете повторно выдать исключение в своем улове, если вы хотите выполнить некоторую обработку внутри функции (например, печать в STDERR), но пусть она всплывает!
Другой, более традиционный метод — заставить вашу функцию возвращать какой-то код ошибки. Самым основным является «true» в случае успеха, «false» или «null» в случае сбоя, как в первом примере. Я не вижу в этом ничего плохого.
Что еще сложнее, что если функция на самом деле ничего не возвращает и, следовательно, не присваивает значение переменной? Как с этим бороться?
Бросайте исключения, это их работа!
Как мне убедиться, что когда попытка не удалась, блок в цикле никогда не достигает других функций
Не пытайтесь поймать / перехватить внутри функции или повторно выдать исключение из вашей «ловушки».
Буду ли я использовать пустую переменную, которая просто возвращает true при успехе и false и fail, и выполнять следующий код в главном блоке только при true? Или есть лучшее соглашение для этого в PHP?
Да, есть лучшее соглашение: выбросить исключения.
Других решений пока нет …