传错连接名会抛出think\db\exception\datanotfoundexception异常,提示connection not found: xxx;该异常区分大小写且不被默认处理器吞掉,需显式try/catch捕获。

Db::connect() 传错连接名会抛什么异常
传入一个 config/database.php 的 connections 数组里根本不存在的键名(比如写成 'logdb',但配置里是 'log_db'),框架会直接抛出 Connection not found: logdb 异常,类型为 think\db\exception\DataNotFoundException。
这个异常不会被默认的全局异常处理器静默吞掉——它会中断执行、返回 500 错误页(开发环境)或记录到日志(生产环境)。所以你必须显式 try/catch 才能捕获并处理。
- 连接名区分大小写,
'LogDB'≠'log_db' - 连接名不能含点号、空格、大写字母,
'db.log'或'MyDB'都非法 - 拼写错误是最常见原因,建议在 IDE 中用字符串字面量跳转到
connections定义处核对
如何在模型中安全调用多库并捕获连接失败
模型通过 $connection 属性绑定连接时,框架只在模型类首次实例化时读取一次该值。如果数据库服务宕机或凭据失效,查询会直接抛 PDO 异常(如 PDOException: SQLSTATE[HY000] [2002] Connection refused),而不是提前报连接未找到。
因此,捕获重点不是“连哪个库”,而是“连得上吗”。推荐在关键业务方法里包裹:
try {
$users = UserModel::where('status', 1)->select();
} catch (\PDOException $e) {
// 比如记录到监控系统、降级返回缓存数据
Log::error('主库查询失败', ['message' => $e->getMessage()]);
return $this->getFallbackUsers();
} catch (\think\db\exception\DataNotFoundException $e) {
// 连接名配置错误等框架层问题
throw new \InvalidArgumentException('模型连接配置异常:' . $e->getMessage());
}
- 不要只 catch
Exception,PDO 异常和框架异常应分开处理 - 模型绑定的连接不支持运行时热切换,改了
$connection值也不会生效 - 事务内跨连接操作无效,
Db::connect('log_db')->startTrans()和主库事务完全隔离
env() 变量缺失导致 type 字段为空时的报错表现
如果在 connections 配置里用了 'type' => env('DB_TYPE', 'mysql'),但 .env 文件漏写了 DB_TYPE,且没给默认值,最终 type 就是 null。框架无法识别驱动,会抛 Class 'think\db\connector\Null' not found —— 它试图加载一个叫 Null 的驱动类。
这不是连接超时或权限问题,而是配置解析阶段就崩了,连 PDO 实例都不会创建。这类错误通常出现在部署后首次启动时。
- 务必为所有 env() 调用提供合理默认值,比如
env('DB_TYPE', 'mysql') - 检查
type字段是否严格等于'mysql'、'pgsql'、'sqlsrv'之一,大小写敏感 - 执行
php think clear:config后再测,避免旧缓存掩盖问题
Db::connect() 传数组方式的异常捕获要点
用 Db::connect(['type'=>'mysql', ...]) 动态建连时,异常类型和预定义连接一致,但触发时机更早:框架会先尝试 new PDO,失败就直接抛 PDOException;成功后再初始化 Query 对象,这时才可能抛框架异常。
这种方式绕过了 connections 配置校验,容易漏掉 charset、prefix 等参数,导致后续查询乱码或表名拼错。高并发下还可能耗尽 MySQL 连接数。
- 临时调试可用,生产环境必须走预定义连接 +
env()注入 - catch
PDOException时注意区分错误码:2002(拒绝连接)、1045(认证失败)、1049(库不存在) - 不要在循环里反复调用
Db::connect($config),每个调用都新建 PDO 实例
$connection 值,三者必须完全一致且拼写精确;任何一处脱节,异常都不会告诉你“配置错了”,只会以底层 PDO 错误或类加载失败的形式出现。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











