Должна ли функция возвращать разные значения в случае ошибки и в случае если нет данн

korchasa

LIMB infected
Это две разные ситуации. В одной все хорошо, но данных нет, во второй что-то не так. Поисковики, например, по 404 заголовку трут страницы, так что и тут разделять полезно.

Первую обычно приходится обрабатывать "ручками" - страница с надписью "Пользователь не найден" с 404 заголовком. Можно и тут автоматизировать, в принципе, через выброс DataNotFoundException какого-нибудь.

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

TutanXamoN

Новичок
ИМХО: ф-ция должна возвращать разные значения. более того больше чем просто FALSE||NULL.
Пусть на этапе отладки это можно заменить другими методами, но на этапе эксплуатации это есть незаменимая вещь.
Реализаций бесконечное множество.
Касательно:
Но уж очень не люблю писанину, когда на одну строчку собственно значимого действия пишется еще три с ритуальными приседаниями.
Увы, Фанáт, всё программирование в современном виде это 10-ритуальных приседаний над пользователем ради одной строчки действия...
 

Духовность™

Продвинутый новичок
в современном виде это 10-ритуальных приседаний над пользователем ради одной строчки действия...
сомневаюсь, что на С вы с таким подходом к делу делали всего 10 приседаний...

чем яснее архитектура - тем легче её рефакторить и вообще писать.
 

Фанат

oncle terrible
Команда форума
В общем, да. Кажется, сложилось в голове.
В итоге я пришел к тому, что программные ошибки внутри - ради бога. Все они сводятся к возврату FALSE.
Хочется кинуть исключение - пожалуйста. Но не внутри, а снаружи. проверяй возврат на FALSE и кидай чего твоей душе угодно.
А внутри и без исключений все хорошо: Информацию об ошибке программисту в stderr оно само и так отдаст по-любому.
А вторую (и главную, на самом деле), функцию исключений - оборвать бессмысленное дальше выполнение - прекрасно берет на себя return!.

"Данные не найдены" обрабатывать надо.
У меня, собственно, неправильный пример выше.
PHP:
$data = $db->query(2,  "SELECT * FROM news WHERE id = %s", $GET['id']);
if ($data === FALSE) errpage(500);
if ($data === NULL) errpage(404);
include "shablon.php";
То есть, если по минимуму, то побрив ситуацию бритвой оккама, без класса можно таки обойтись :)
 

Splurov

Новичок
А вторую (и главную, на самом деле), функцию исключений - оборвать бессмысленное дальше выполнение - прекрасно берет на себя return!.
Как раз бессмысленное выполнение при ошибке прекращает исключение, которое ловится в index.php
(типа try { $application->run(); } catch(Exception $e) { error(500); log($e); }).
 

Фанат

oncle terrible
Команда форума
ну так уровней исключений может быть много.
Не обязательно при любой ошибке прибивать скрипт - бывают ведь и не критические.
И для них тоже ведь нужны исключения. Скажем, не поступили данные для запроса, то есть формировать запрос и выполнять его нет смысла - лог будет завален лишними ошибками.
Для отлова таких ситуаций тоже удобны исключения, служащие этакой "маленькой смертью", альтернативой лестнице if-ов


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

А городить обработчик ошибок, В КОТОРОМ будет прописано, критическая ошибка, или нет - т.е. разнося логику приложения на две части - увольте нафиг.
 

Splurov

Новичок
*****
Не обязательно. Не критические ловятся "выше" в коде. Если не поступили данные для запроса, то ты и $db->query() делать не будешь, а значит исключения из-за неверного запроса не появится. А если запрос составлен неверно и, например, при некоторых входных данных, становится ошибочным - исключение ловится на самом нижнем уровне, а работа приложения прерывается.
 

Фанат

oncle terrible
Команда форума
Ну вот у меня другой подход.
Я хочу все предельно абстрагировать и запихать.
И проверять не перед вызовом, а внутри.
 

Splurov

Новичок
Если в запросе ошибка - это не всегда критическая ошибка?
 

Фанат

oncle terrible
Команда форума
ну представим, что произошла ошибка в коде показа, скажем, баннеров.
Остальную-то страницу мы все равно показываем.
То есть, такую ошибку я считаю некритичной. Просто не заполняем один блок в шаблоне.
 
Сверху