Ваша реализация просто великолепна, и она будет отлично работать для большинства целей.
Нет необходимости помещать каждый запрос в блок try / catch, и на самом деле в большинстве случаев вы этого не хотите. Причина этого заключается в том, что если запрос генерирует исключение, это является результатом фатальной проблемы, такой как синтаксическая ошибка или проблема с базой данных, и это не те проблемы, которые вы должны учитывать при каждом выполнении запроса.
Например:
try {
$rs = $db->prepare('SELECT * FROM foo');
$rs->execute();
$foo = $rs->fetchAll();
} catch (Exception $e) {
die("Oh noes! There's an error in the query!");
}
Запрос здесь будет либо работать правильно, либо не работать вообще. Обстоятельства, при которых это вообще не сработает, никогда не должны возникать с какой-либо регулярностью в производственной системе, поэтому они не являются условиями, которые вы должны проверить здесь. Это на самом деле контрпродуктивно, потому что ваши пользователи получают ошибку, которая никогда не изменится, и вы не получите сообщение об исключении, которое предупредит вас о проблеме.
Вместо этого просто напишите это:
$rs = $db->prepare('SELECT * FROM foo');
$rs->execute();
$foo = $rs->fetchAll();
Как правило, единственный раз, когда вы захотите перехватить и обработать исключение запроса, это когда вы хотите сделать что-то еще, если запрос не удался. Например:
// We're handling a file upload here.
try {
$rs = $db->prepare('INSERT INTO files (fileID, filename) VALUES (?, ?)');
$rs->execute(array(1234, '/var/tmp/file1234.txt'));
} catch (Exception $e) {
unlink('/var/tmp/file1234.txt');
throw $e;
}
Вы захотите написать простой обработчик исключений, который будет регистрировать или уведомлять вас об ошибках базы данных, которые происходят в вашей производственной среде, и отображать дружественное сообщение об ошибке для ваших пользователей вместо трассировки исключений. См. http://www.php.net/set-exception-handler для получения информации о том, как это сделать.