【发布时间】:2023-04-02 04:17:01
【问题描述】:
mkdir() 工作正常这个问题更多的是关于捕捉错误。而不是在目录存在时打印它,我只想让它在自定义日志中写入一条消息给我。如何创建此异常。
警告:mkdir() [function.mkdir]:文件存在
【问题讨论】:
标签: php exception-handling mkdir
mkdir() 工作正常这个问题更多的是关于捕捉错误。而不是在目录存在时打印它,我只想让它在自定义日志中写入一条消息给我。如何创建此异常。
警告:mkdir() [function.mkdir]:文件存在
【问题讨论】:
标签: php exception-handling mkdir
您可以通过使用display_errors 设置全局(在配置或运行时)抑制错误消息来停止显示错误消息,或者通过在函数调用前加上@ 字符逐个案例。 (例如@mkdir('...'))。
当mkdir 返回false 时,您可以使用error_get_last 检查。
对于错误记录全局规则适用。您可以使用error_log 手动记录错误。
如需进一步阅读,请参阅Error handling 上的手册部分。
编辑:
正如 cmets 中所建议的,自定义错误处理程序也是一种可能的、可以说更健壮(取决于您的实现)但肯定更优雅的解决方案。
function err_handler($errno, $errstr) {
// Ignore or log error here
}
set_error_handler('err_handler');
这样,错误消息将不会显示,除非您明确地回显它。但请注意,当使用自定义错误处理程序时,error_get_last 将返回 NULL。
【讨论】:
set_error_handler,但我认为这个答案仍然非常有效且有帮助。)
我只想让它在自定义日志中写给我的消息。
解决方案非常简单。 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*/}
【讨论】:
你可以用这样的类重写任何系统调用函数:
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 {...} 处理所有系统错误。
【讨论】:
mkdir() 函数不会启动整个其他程序。