Intereting Posts
Мне нужен удобный для чтения, но формат документа, пригодный для анализа Как заставить IE8 не показывать мою PHP-страницу пустым Написание приложения для чата PHP: любая функция, возвращающая первые / последние N элементов массива PHP отображает / загружает файлы каталога за пределами корня веб-сервера каталог не создается при запуске сценария оболочки bash в php Apache PHP / OSX Mavericks: – не удалось открыть поток: слишком много открытых файлов Не удалось установить драйвер php mongodb на mac os 10.9 QuickBooks IPP v3 получает ошибку 3200 при добавлении счета-фактуры Простое обнаружение смартфона Доступ к значениям массива можно получить с помощью переменных переменных? PDO-эквивалент mysql_fetch_array Заголовок «Передача-кодирование: chunked» в PHP Как я могу использовать PHP для динамического опубликования файла iical для чтения в Календаре Google? Хорошие криптографические хэш-функции

Выбросить исключение в функции или как выполнить обработку ошибок спуска

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

Но на данный момент я застрял в MySQLi, поэтому хочу знать, эффективен ли мой текущий код? Во многих учебниках и книгах я могу найти подобный рабочий процесс, однако в некоторых местах я читал «Использование исключений, чтобы уведомить пользователя о том, что какой-то метод неэффективен, неэффективен и считается плохой практикой». ( http://www.sitepoint.com/forums/showthread.php?872057-should-i-use-1-or-many-try-catches-in-a-page-that-uses-PDO )

try{ $user = $dataUser->getById(1); }catch(UserNotFoundException $unfe){ echo 'No user found with the provided id'; }catch(Exception $exc){ //do some logging with the real exception ... //show a readable error to the website visitor echo "There was an error retrieving the user from the database."; } In my function I use something like this: function getById($id){ $query = "select user_id, username,firstname from users where user_id = ?"; if ($stmt = $this->database->getConnection()->prepare($query)) { $stmt->bind_param('i',$id); if($stmt->execute()){ throw new exception('There was an error retrieving the user by id: ' . $stmt->error); } $stmt->bind_result($userId,$username); $stmt->store_result(); $stmt->fetch(); if(($stmt->num_rows) == 1){ $stmt->close(); $user = new User($username); $user->userId = $userId; $user->username = $username; return $user; }else{ $stmt->close(); throw new UserNotFoundException("No user found matching the id."); } }else{ throw new Exception("There was a database error retrieving the user by id: " . $this->database->getConnection()->error); } } 

ОБНОВЛЕНИЕ 1 на основе комментария «Ваше здравое чувство»

mysqli_report(MYSQLI_REPORT_ALL); не работает, что здорово ..

Я сделал некоторую практику, но мне все еще непонятно, в чем разница между исключениями и ошибками. Когда я использую PDO, я выдаю исключения, когда выполняется сбой. Mysqli этого не делает. Вы должны проверить это самостоятельно, а не бросить. Допустим, я использую databasewrapper и называю это:

  $this->db->getOne($query,'id'); 

Где-то в этом методе появляется $ stmt-> execute. Должен ли я проверить, удалось ли это сделать и выбросить исключение, или я должен вызвать ошибку здесь?

Потому что вы предлагаете error_handler.

Это сбивает меня с толку, потому что, если я использую pdo, я должен использовать exception_handler правильно?

ОБНОВЛЕНИЕ 2

  1. А как насчет аякса? Я использую JSON для возврата результатов. В случае ошибки, следует ли использовать try catch здесь для возврата json.success true или false? Или как я могу обрабатывать ошибки здесь?

  2. Что делать, если я хочу показать более конкретную информацию? Например: когда пользователь выполняет регистрацию и использует имя пользователя и / или электронную почту, которые уже зарегистрированы, возникает ошибка, потому что уникальный ключ нарушен. Но я не просто хочу показать «эй 500 ошибок», потому что в этом случае важно, чтобы регистратор знал, в чем проблема, например «это имя пользователя принято», …

    Правильно ли, что в этих случаях попытка поймать – хорошая практика, потому что вы хотите показать подробную информацию?

Я просто путаюсь, когда использовать try catch и когда позволить глобальному обработчику ошибок обрабатывать ошибку для меня. В этом разделе я прочел следующее:

«Вы можете использовать set_exception_handler (), чтобы иметь дело с неперехваченными исключениями в вашей настраиваемой функции. Однако« правильный »способ – попытаться … уловить исключение, когда, например, выполнить запрос, и использовать свою настраиваемую функцию для регистрации это соответственно ». Но это считается плохой практикой в ​​этой теме.