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 {...} 一般。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top