在Kohana中捕获数据库异常

时间:2010-04-18 15:00:46

标签: php database exception-handling frameworks kohana

我正在使用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 个答案:

答案 0 :(得分:1)

你可以捕获异常,但你可能试图在错误的地方捕获它。尝试捕获低级别异常的问题在于它可以从许多不同的来源中生成。

例如,如果对会话使用数据库驱动程序,则会从会话库中的数据库驱动程序实例化中抛出异常(在会话调用中实例化,这可能在您实例化任何模型之前发生)。

从模型中发现可以发生异常,但更有可能发生在另一个来源 - 在这种情况下,你可能需要扩展一些库,或者确保你要包装一个基本模型parent::__construct调用和try-catch块中的会话库。

(我个人会扩展模型库,而不是将其放在基础模型中)

希望有所帮助。

答案 1 :(得分:1)

Kohana 2不会将错误转换为异常。您将需要附加自己的错误处理程序,或使用error_reporting()关闭错误(暂时)然后自己进行某种处理。

答案 2 :(得分:0)

我不知道Kohana,但try .. catch块不能捕获正常错误,只有Exception s。你确定Kohana会将Exception扔到你希望收到Exception的地方吗?

根据您的评论进行编辑:
首先,在生产环境(意味着您的实时应用程序)中,您应该始终禁用向屏幕显示PHP错误。只能在开发环境中向屏幕显示这些错误,以通知您(开发人员)。但是,您的实时应用程序的访问者无需了解/阅读PHP错误,因为它可能会泄露有关您环境的敏感信息。但是,您应该将错误记录到日志文件中。

此外,我只是快速浏览一下Kohana,确实看到了这里和那里有异常,但它似乎并没有以一致的方式做到这一点。

如果您希望将php错误视为异常,请查看this documentation中的示例#1。