mkdir() 不抛异常,仅返回 false 并触发 E_WARNING,故 try-catch 无法捕获;需手动检查返回值并 throw 异常才能被 catch 捕获。

PHP 的 mkdir() 函数本身**不会主动抛出异常**,它在失败时仅返回 false 并触发一个 E_WARNING(例如权限不足、路径无效、父目录不存在且未启用递归等)。因此,直接用 try-catch 捕获 mkdir() 的“异常”是无效的——除非你先把它包装成会抛出异常的逻辑。
为什么 mkdir 不进 catch?
mkdir() 是传统 PHP 函数,遵循“返回 false + 触发警告”的错误模式,而非面向对象的异常机制。而 catch 只能捕获 throw 出来的 Exception 或其子类,对警告(warning)或错误(error)无感。
正确做法:手动转为异常
你需要自己判断 mkdir() 是否失败,并在失败时 throw 一个异常。这样 try-catch 才能起作用:
- 先调用
mkdir($path, $mode, true) - 检查返回值是否为
false - 若是,说明创建失败,此时
throw new RuntimeException(...) - 把整个逻辑包进
try块里
示例代码:
<?php $dir = '/path/to/nested/dir';
try {
if (!mkdir($dir, 0755, true) && !is_dir($dir)) {
throw new RuntimeException("无法创建目录: $dir");
}
echo "目录创建成功";
} catch (RuntimeException $e) {
error_log($e->getMessage() . "\n" . $e->getTraceAsString());
echo "操作失败:" . $e->getMessage();
}
?>
更健壮的写法:结合 is_writable 和 clearstatcache
有时失败是因为父目录不可写,或系统缓存了旧的 is_dir() 结果。建议:
- 调用
clearstatcache(true, $parentDir)避免路径状态误判 - 用
dirname($dir)检查父目录是否存在且可写 - 失败时提供具体原因,比如 “父目录 /path/to 不可写”
注意权限参数的写法(避免警告)
别写 0755 这样的裸数字——PHP 会警告 "Use of undefined constant 0755"。应写成:
-
0o755(PHP 8.1+ 推荐,明确八进制) - 或字符串
'0755'(向后兼容,自动转为八进制整数) - 或十进制等效值
493(不直观,少用)
不复杂但容易忽略:mkdir 本身不抛异常,要靠你主动封装;异常不是万能兜底,得配合路径检查、权限验证和日志记录才真正可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











