代码之家  ›  专栏  ›  技术社区  ›  Danilo Bargen

在kohana中捕获数据库异常

  •  2
  • Danilo Bargen  · 技术社区  · 16 年前

    我在用科哈纳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 回复  |  直到 16 年前
        1
  •  1
  •   shadowhand    16 年前

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

        2
  •  1
  •   Ixmatus    16 年前

    你可以捕捉到异常,但你可能试图在错误的地方捕捉到它。试图捕获低级别异常的问题是,它可以从许多不同的源派生。

    例如,如果将数据库驱动程序用于会话,则将从会话库中的数据库驱动程序的实例化中引发异常(在调用会话时实例化,该调用可能在实例化任何模型之前发生)。

    抓住那个例外 可以 从模型中发生,但更可能从另一个源中发生-在这种情况下,可能需要扩展几个库,或者确保包装的是基本模型 parent::__construct 调用和try-catch块中的会话库。

    (我个人会扩展模型库来实现这一点,而不是将其放在基本模型中)

    希望能有所帮助。

        3
  •  0
  •   Decent Dabbler    16 年前

    我不认识科哈纳,但是 try .. catch 块将不捕获正常错误,仅 Exception 你确定科哈纳投了 例外 是你期望得到的 例外 S?

    根据您的评论进行编辑:
    好吧,首先,在一个生产环境(意味着你的实时应用程序)中,你应该总是禁止在屏幕上显示php错误。将这些错误显示到屏幕上只能在开发环境中完成,以通知您,开发人员。但是,实时应用程序的访问者不必知道/读取php错误,因为它可能会泄露有关您的环境的敏感信息。但是,您应该将错误记录到日志文件中。

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

    如果希望将php错误视为异常,请查看 this documentation .