在 Codeigniter 中捕获 Doctrine 异常的最佳方法

Posted

技术标签:

【中文标题】在 Codeigniter 中捕获 Doctrine 异常的最佳方法【英文标题】:Best way to catch Doctrine Exceptions in Codeigniter 【发布时间】:2011-07-18 13:34:42 【问题描述】:

您认为在 codeigniter 框架中捕获所有学说 1.2 ORM 异常的最佳方法是什么,我不想用 try catch 包装整个 index.php,但也不想在每个查询之前和之后进行 try catch ,

【问题讨论】:

如果不是这两个,您会想到哪些其他选项?你已经尝试过这些吗? index.php 有什么不好? 【参考方案1】:

嗯,首先,您必须在index.php 中只换行。实际上,如果您有不想显示的异常(例如在生产环境中),这可能会很好。

这里的第二点是你的数据库相关代码应该集中在模型中。所以你可能会引入辅助类,类似于

class SafeQueryHelper
    public static function safeQueryRun(Doctrine_Query $q, array $parameters, $hydration=Doctrine_Core::HYDRATE_RECORD)
        try
            return $q->execute($parameters, $hydration);
        
        catch(Exception $e)
            //Handle yur exceptions here
        
    

您只需将所有模型中的$query->execute($params,$hydration) 替换为SafeQueryHelper::safeQueryRun($query,$params,$hydration)。不要忘记使用$this->load->helper('SafeQueryHelper') 或the config 加载它。

对于像 updatedelete 这样的记录方法 - 您必须将其包装在 try .. catch 中。

好吧,如果您没有将与数据库相关的逻辑集中在模型中...实际上这不会改变任何事情,但这意味着您的应用程序设计不佳,违反了MVC 模式的基本原则,所以开始重构吧。

最后可能的解决方案 - 是侵入 Doctrine 核心类(特别是进入 Doctrine_Connection)并包装到执行实际查询的 try ... catch 行中。但这是个坏主意,我真的不会那样做。

一点更新:由于所有 Doctrine 实体对象都是 Doctine_Record 的子类,您可以使用包装 savedelete 等的方法扩展 SafeQueryHelper

public static function SafeSave(Doctrine_Record $entity)
    try
        $entity->save();
    
    catch(Exception $e)
        //catch it
    

而不是将$entity->save()替换为SafeQueryHelper::SafeSave($entity)

【讨论】:

以上是关于在 Codeigniter 中捕获 Doctrine 异常的最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

未捕获的ReferenceError:$未定义 - Datepicker - Codeigniter 3

未捕获的 TypeError: $(...).select2 不是 CodeIgniter 中的函数

未捕获的 ReferenceError:$ 未定义 - Datepicker - Codeigniter 3

PHP - Codeigniter:未捕获的异常“PHPExcel_Reader_Exception”,消息“无法打开读取,文件不存在”

在 CodeIgniter 3 中多次渲染视图

如何在 codeigniter 模型中使用 mysql 事件调度程序