mkdir() 工作正常这个问题更多的是关于捕捉错误。而不是在目录存在时打印它,我只想让它在自定义日志中写入一条消息给我。如何创建此异常。
警告:mkdir() [function.mkdir]:文件存在
mkdir() 工作正常这个问题更多的是关于捕捉错误。而不是在目录存在时打印它,我只想让它在自定义日志中写入一条消息给我。如何创建此异常。
警告:mkdir() [function.mkdir]:文件存在
我只想让它在自定义日志中写给我的消息。
解决方案非常简单。PHP 已经为您准备好了一切:
ini_set('display_errors',0);
ini_set('log_errors',1);
ini_set('error_log','/path/to/custom.log');
或 php.ini 或 .htaccess 中的相同设置
我认为这比手动编写每个可能的错误要好
如果您不希望记录此错误(因为它可能不是错误而是应用程序逻辑的一部分),您可以先检查文件夹是否存在
if (!file_exists($folder)) mkdir($folder);
else {/*take some appropriate action*/}
您可以通过使用设置全局(在配置或运行时)抑制错误消息来停止显示错误消息display_errors
,或者通过在函数调用前加上 -字符来逐个显示@
。(例如@mkdir('...')
)。
然后,您可以检查error_get_last
何时mkdir
返回false
。
对于错误日志记录全局规则适用。您可以使用 手动记录错误error_log
。
如需进一步阅读,请参阅错误处理手册部分。
编辑:
正如评论中所建议的,自定义错误处理程序也是一种可能的、可以说更健壮(取决于您的实现)但肯定更优雅的解决方案。
function err_handler($errno, $errstr) {
// Ignore or log error here
}
set_error_handler('err_handler');
这样,错误消息将不会显示,除非您明确地回显它。但是请注意,当使用自定义错误处理程序时,error_get_last
将返回NULL
.
您可以使用这样的类重写任何系统调用函数:
file: system.php
namespace abc;
class System {
const CAN_NOT_MAKE_DIRECTORY = 1;
static public function makeDirectory($path) {
$cmd = "mkdir " . $path;
$output = \shell_exec($cmd . " 2>&1"); // system call
if ($output != "") {
throw new \Exception($output, System::CAN_NOT_MAKE_DIRECTORY);
}
return(\TRUE);
}
}
然后就可以调用方法拦截异常了:
file: index.php
namespace abc;
require 'system.php';
try {
System::makeDirectory($directoryName);
} catch (\Exception $e) {
throw new \Exception($e->getMessage(), System::CAN_NOT_MAKE_DIRECTORY);
}
现在您可以正常处理所有系统错误try {...} catch(...) {...} finally {...}
。