Поймать исключение базы данных в Кохане - PullRequest
2 голосов
/ 18 апреля 2010

Я использую Kohana 2. Я хотел бы перехватить исключение базы данных, чтобы предотвратить появление страницы ошибки, когда невозможно установить соединение с сервером.

Отображаемая ошибка:

system/libraries/drivers/Database/Mysql.php [61]:

mysql_connect() [function.mysql-connect]: Lost connection to MySQL server at
'reading initial communication packet', system error: 110

На данный момент сервер базы данных вообще недоступен.

Я делаю это из модели. Я пробовал оба

public function __construct()
{
    // load database library into $this->db
    try
    {
        parent::__construct();
    }
    catch (Exception $e)
    {
        die('Database error occured');
    }
}

а также

try
{
    $hoststatus = $this->db->query('SELECT x FROM y WHERE z;');
}
catch (Exception $e)
{
    die('Database error occured');
}

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

Ответы [ 3 ]

1 голос
/ 19 апреля 2010

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

Например, если вы используете драйвер базы данных для своих сеансов, то исключение будет вызвано из-за создания экземпляра драйвера базы данных в библиотеке сеансов (который создается в вызове сеанса, который, вероятно, произойдет до того, как вы создадите экземпляр какой-либо модели).

Перехват этого исключения может произойти из модели, но более вероятно, что это произойдет из другого источника - в этом случае вам, вероятно, придется расширить несколько библиотек или убедиться, что вы переносите базу вызов модели parent::__construct и библиотека сеанса в блоке try-catch.

(я бы лично расширил библиотеку Model, чтобы сделать это вместо того, чтобы поместить ее в базовую модель)

Надеюсь, это поможет.

1 голос
/ 06 мая 2010

Kohana 2 не преобразует ошибки в исключения.Вам нужно будет либо присоединить свой собственный обработчик ошибок, либо использовать error_reporting(), чтобы отключить ошибку (временно), а затем выполнить некоторую обработку самостоятельно.

0 голосов
/ 18 апреля 2010

Я не знаю Kohana, но блок try .. catch не будет ловить обычные ошибки, только Exception s. Вы уверены, что Кохана бросает Exception с, где вы ожидаете получить Exception с?

Редактировать на основе ваших комментариев:
Ну, во-первых, в производственной среде (имеется в виду ваше живое приложение) вы всегда должны отключать отображение ошибок PHP на экране. Отображение этих ошибок на экране должно быть сделано только в среде разработки, чтобы сообщить вам, разработчику. Тем не менее, посетители вашего живого приложения не должны знать / читать ошибки PHP, так как оно может раскрыть конфиденциальную информацию о вашей среде. Однако вы должны записать ошибки в файл журнала.

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

Если вы хотите, чтобы ошибки php рассматривались как исключения, посмотрите пример №1 в этой документации .

...