4

mkdir() 工作正常这个问题更多的是关于捕捉错误。而不是在目录存在时打印它,我只想让它在自定义日志中写入一条消息给我。如何创建此异常。

警告:mkdir() [function.mkdir]:文件存在

4

3 回答 3

10

我只想让它在自定义日志中写给我的消息。

解决方案非常简单。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*/}
于 2010-04-21T08:00:03.410 回答
2

您可以通过使用设置全局(在配置或运行时)抑制错误消息来停止显示错误消息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.

于 2010-04-21T07:04:38.873 回答
2

您可以使用这样的类重写任何系统调用函数:

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 {...}

于 2017-08-15T00:14:27.887 回答