Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Обработка ошибок MySQLi
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Помог: 5 раз(а)
[+]
Доброго всем дня. Попытка получить помощь на StackOverflow провалилась, может звезды на небе не так расположились, но на вопрос так внятного ответа я так и не получил, хотя обычно все не так, поэтому решил задать вопрос здесь. Я вообще не активный пользователь, мне документации PHP более чем хватает, но вот такой случай, что нужна помощь сообщества.
Решил вернуться в PHP после некоторого перерыва, начал писать систему "для себя", разработка идет нормально, архитектура системы в общем-то есть, кодовая база тоже есть, но вот остановился на этой проблеме.
Расширение MySQL устарело уже и морально, и вообще, как только можно, вначале я хотел работать с PDO, но пришел к выводу, что это лишнее и что объектно-ориентированного MySQLi мне более чем хватит.
В моей системе все системные ошибки отображаются в виде оформленной страницы, ошибки MySQLi не исключение, поэтому их нужно отлавливать.
В документации продемонстрирован вот такой способ делать это:
Проблема в том, что методов много, в практически каждом из них может произойти ошибка БД, мне придется переопределять все методы таким образом, что бы поймать ошибку.
На StackOverflow мне предложили работать с исключениями, но, честно говоря, я не очень понимаю их концепцию и принцип работы и вообще избегаю их, хотя верю в то, что это удобный инструменты для знающего кодера.
но я не понимаю, чем это в принципе отличается от окружения блоком if/else.
В общем, сам вопрос: есть ли способ получше, чем переопределять большое количество методов или окружать каждый вызов блоком if/else (try/catch(?))
Возможно, проблема в самой концепции моей идеи, в таком случае я так же буду рад услышать более лучший способ работать с БД (?).
Спасибо.
esterio
Отправлено: 07 Февраля, 2013 - 19:25:02
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Самым лучим для меня обьяснением try...catch стал следующий пример
Думаю и Вам станет более понятно что ето такое после даного примера. Тепер подумайте если бы нужно было обработать ошыбку на самом верху при визове функции f1 - нужно бы было всюду возвращать false. а так только в одном месте
Вобще сам работаю с бд с помощью mysqli но такой задачи никогда небыло и не задумывался про исключения, и скорее всего mysqli их не кидает, а вот PDO точно знаю что кидает, возможно лучшим вариантом будет использовать его чем переопределять класс mysqli
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
DeepVarvar
Отправлено: 07 Февраля, 2013 - 19:32:52
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Помог: 5 раз(а)
[+]
DeepVarvar пишет:
Это и есть тот самый лучший способ.
Хорошо, спасибо.
DeepVarvar пишет:
А вы попробуйте, вдруг поймете
Окружать весь потенциально опасный код блоком try/catch?
esterio
Отправлено: 07 Февраля, 2013 - 19:41:04
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
Можна и через triger_error как делали бородатые дяди( ) до ПыХы 5, но исключения куда красивей. (Добавление)
_Dark_ пишет:
Окружать весь потенциально опасный код блоком try/catch?
Можно делать их сколько угодно и вложений тоже можно, главное не пересолить
DelphinPRO
Отправлено: 07 Февраля, 2013 - 19:43:42
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Фишка в том, что вы можете выкидывать свой тип исключений, унаследовав его от \Exception и переопределив необходимые методы. Таким образом, вся обработка ошибок (Подготовка сообщений, логирование, etc...) будет сосредоточена в одном месте, а не по всему коду.
----- Чем больше узнаю, тем больше я не знаю.
_Dark_
Отправлено: 07 Февраля, 2013 - 19:44:40
Частый гость
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Покинул форум
Сообщений всего: 231
Дата рег-ции: Окт. 2011
Помог: 5 раз(а)
[+]
DelphinPRO пишет:
Фишка в том, что вы можете выкидывать свой тип исключений, унаследовав его от \Exception и переопределив необходимые методы. Таким образом, вся обработка ошибок (Подготовка сообщений, логирование, etc...) будет сосредоточена в одном месте, а не по всему коду.
Уже оттуда пойдет большая часть работы системы именно насчет запроса, т.е. роутинг, обработка данных, отдача контента.
Например, где-то там, далеко, есть проверка
Ведь я могу просто вызвать там свою функцию в том месте, которая подготовит сообщение об ошибке, выведет его и exit();
Я прошу прощения, если я кажусь таким вот занудой, просто правда, пока не пойму саму суть будут всякие сомнения по этому поводу
Здесь на верхнем уровне будут обрабатываться, допустим, фатальные ошибки. Чуть глубже вы можете обернуть код еще одним блоком try..catch
и в том кетче решать, можно ли обработать ошибку на месте, или перекинуть ее выше.
Я немного скомканно объясняю , лучше умную статью почитать, чтобы понять принцип работы исключений, способы их применения и полезность
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.