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

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

Чем полезны и приятны исключения, можно узнать в статье «обработка исключений в PHP». Здесь же приведем только их иерархию и описание.

Иерархия исключений в goDB

goDBException

Базовый класс для всех исключений goDB


try {
    Application.Run();
} catch (goDBException $e) {
    echo "Что-то случилось с БД";
} catch (Exception $e) {
    echo "Что-то случилось с чем-то другим";
}			
			

goDBExceptionConnect

Ошибка подключения к серверу БД или выбора базы. Единственное исключение библиотеки, которое может возникать на отлаженном проекте. И единственное исключение, которое следует перехватывать, чтобы вывести пользователю красивую страничку с сообщением об ошибке.

Все остальные исключения возникают из-за ошибок в коде и должны давиться на этапе разработки.


try {
    $db = new goDB($host, $login, $password, $dbname);
} catch (goDBExceptionConnect $e) {
    echo "Сервер не дышит";
}			
			

goDBExceptionQuery

Ошибка при выполнении запроса. Объект исключения позволяет получить информацию о запросе:


try {
    $db->query("select * from `table`", null, "assoc"); // Допустим таблица `table` не существует
} catch (goDBExceptionQuery $e) {
	echo "Ошибка запроса: ".$e->error();
	echo "Код ошибки: ".$e->errno();
	echo "Запрос, вызвавший ошибку: ".$e->query();
}			
			

goDBExceptionData

Неверная пара шаблона и входных данных.

При использовании простых (не именованных) плейсхолдеров, их количество в шаблоне должно чётко соответствовать количеству входных данных.


$db->query('INSERT INTO `table` VALUES (?,?,?)', array(1,2));     // goDBExceptionDataNotEnough: данных не хватает
$db->query('INSERT INTO `table` VALUES (?,?,?)', array(1,2,3,4)); // goDBExceptionDataMuch: лишние данные
			

Именованные плейсхолдеры не обязаны соответствовать всех ключам входного массива. Если же указанного в плейсхолдере ключа не существует, генерируется goDBExceptionDataNotEnough.


$struct = array('a' => 1, 'b' => 2, 'c' => 3);
$db->query('INSERT INTO `table` SET `a`=?:a, `b`=?:b', $struct); // Всё нормально, "c" указывать не обязательно
$db->query('INSERT INTO `table` SET `a`=?:a, `d`=?:d', $struct); // goDBExceptionDataNotEnough: нет ключа "d"
			

Одновременное использование простых и именованных плейсхолдеров в одном запросе не допустимо.


$db->query('INSERT INTO `table` SET `a`=?:a, `b`=?', $data); // goDBExceptionDataMixed
			

Неизвестный плейсхолдер (а также именованный без указания имени) вызывает goDBExceptionDataPlaceholder


$db->query('INSERT INTO `table` SET ?unkonwn'); // неизвестный плейсхолдер
$db->query('INSERT INTO `table` SET `x`=?i:');  // двоеточие есть, а имени нет
			

goDBExceptionFetch

Ошибочный формат представления результата.

goDBExceptionFetchUnknown: вообще неизвестный.

goDBExceptionFetchUnexpected: не соответствует запросу. Например assoc после INSERT.

goDBExceptionDB

Производные от этого исключения (goDBExceptionDBAlready и goDBExceptionDBNotFound) могут возникнуть при работе с пространством имен.

Более подробно об этом можно узнать в «разделе о пространстве имен».

© Григорьев Олег aka vasa_c, 2006—2010