Ошибка обработки MySQLi?

Я начал использовать OO-MySQLi после процедурного MySQL, и у меня есть проблема.

В рабочей среде моя система отображает все ошибки как пользовательскую страницу. Ошибки MySQLi также являются «ошибкой», и я хочу их поймать, но в документации описывается только один способ сделать это:

if (!$mysqli->query("SET a=1")) { exit('An error occurred: ' . $mysqli->error); } 

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

Конечно, я могу расширить класс mysqli, например:

 class myMysqli { public function __construct(/* ... */) { parent::__construct(/* ... */); } public function query(/* .. */) { parent::query(/* ... */); if($this->errno !== 0) { // An error occurred } } } $mysqli = new myMysqli(/* ... */); $mysqli->query(/* ... */); 

Но таким образом мне нужно расширить почти ВСЕ методы, где может возникнуть ошибка. Кроме того, MySQLi предоставляет подготовленные операторы (класс mysqli_stmt), который имеет свои собственные ошибки!

Можете ли вы узнать лучший способ справиться с ошибками MySQLi? Заранее спасибо.


добавленной

Об исключениях: правильно ли я понимаю, что с исключениями мне нужно сделать что-то вроде этого:

 try { $mysqli->query(/* ... */); } catch (Exception $e) { // An error occurred } 

Но это похоже на

 if(!$mysqli->query(/* ... */)) { // An error occured } 

Какая разница?

Прежде всего, ваш старый подход был неправильным.

 exit('An error occurred: ' . $mysqli->error); 

является плохой практикой в ​​целом и не должен использоваться с mysqli.

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

Исключение лучше, чем регулярная ошибка. Поэтому установите mysqli в режиме исключения, как показано в другом ответе, а затем поймайте все ошибки в обработчике ошибок. Хотя try..catch следует использовать только тогда, когда у вас есть определенное конкретное действие для обработки ошибки.

Я использую метод try … catch …

 try { // get result of record from 'id' $query = "SELECT * FROM models WHERE id =$id"; $result = $mysqli->query($query); if (!$result) { throw new Exception($mysqli->error()); } $row = $result->fetch_array(); } catch (Exception $e) { echo "We are currently experiencing issues. Please try again later."; echo $e->getMessage(); } finally { $result->free(); } 

Это вообще помогает?

Вы используете «try» для проверки условия и генерирования исключения, если он возвращает true (! $ Result). И используйте «catch», чтобы поймать все остальное, что может случиться!