ci框架不支持try/catch异常捕获,依赖php原生错误报告、日志记录、手动检查$db->error()及show_error()等机制处理错误;需配置error_reporting、log_threshold,主动检测数据库操作结果,并通过hooks或自定义trigger_error实现类异常处理。

CI框架默认不提供C++或Java那种结构化异常捕获机制,所有错误都靠返回值、日志记录和手动判断来应对,当你在Model里执行数据库查询失败却没检查$this->db->error(),这个错误就会静默吞掉,直到前端显示空白页才意识到出问题了。
CI框架如何处理运行时错误
CI框架本身不支持try/catch语法捕获逻辑异常,它的错误处理完全基于PHP原生机制与框架层约定。
第一步:开启PHP错误报告,在index.php顶部加入error_reporting(E_ALL); ini_set('display_errors', 1); 这样能让致命错误直接输出到页面,便于开发阶段定位问题。
第二步:在application/config/config.php中设置$config['log_threshold'] = 1; 启用错误日志记录,所有notice/warning/error都会写入application/logs/目录下对应日期的文件。
第三步:在关键业务逻辑处主动调用$this->db->error()检查数据库操作结果,例如:$query = $this->db->get('users'); if ($query->num_rows() == 0) { log_message('error', 'User query returned zero rows'); } ——【不检查$db->error()就直接用$result会导致静默失败】
CI框架的“伪异常”替代方案
方法一:用show_error()函数中断流程并显示友好提示
当检测到非法参数或权限不足时,直接调用show_error('您没有访问该资源的权限', 403); 页面会立即终止渲染并输出带样式的错误页。
方法二:自定义异常类配合trigger_error()
新建application/libraries/Exception_lib.php,定义class CI_Exception extends Exception {};在需要抛错的地方写trigger_error('Invalid user ID format', E_USER_ERROR); 再通过set_error_handler()捕获并转成JSON响应——这一步操作起来很简单,直接把文件拖进去就行。
方法三:借助Hooks在pre_system钩子中统一拦截PHP错误
在application/config/hooks.php中启用钩子,编写钩子函数监听error_get_last(),若发现E_ERROR/E_PARSE则自动记录并跳转到维护页——【pre_system钩子在路由解析前触发,此时CI核心类尚未加载,不能调用$this->load等方法】
数据库异常的特殊处理路径
CI的Active Record不抛出异常,但提供了明确的失败反馈通道。
执行插入操作后立刻检查:$this->db->insert('logs', $data); if ($this->db->affected_rows() === 0) { log_message('error', 'Insert failed: ' . print_r($this->db->error(), TRUE)); }
查询前启用严格模式:$this->db->query("SET SESSION sql_mode='STRICT_TRANS_TABLES'"); 可让MySQL在数据截断或类型不匹配时返回错误而非静默修正。
连接失败时CI会自动触发show_error(),但不会记录到日志——你必须在database.php配置中设置'stricton' => TRUE,并配合log_message('error', 'DB connection failed')手动补全日志链路。











