【问题标题】:Php mkdir( ) exception handlingphp mkdir() 异常处理
【发布时间】:2023-04-02 04:17:01
【问题描述】:

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

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

【问题讨论】:

    标签: php exception-handling mkdir


    【解决方案1】:

    您可以通过使用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。

    【讨论】:

    • 我应该指出,在否决时发表评论是一种很好的做法,也是建设性的。 (更不用说礼貌了。)
    • 我没有对你投反对票,但也许是因为有人看到@-operator 并认为这是不好的做法? (我自己建议使用自定义错误处理程序,使用set_error_handler,但我认为这个答案仍然非常有效且有帮助。)
    • 确实,自定义错误处理程序将是一个更优雅的解决方案。但在所描述的情况下,我认为 @-operator 是一个可以接受的解决方案,因为在我看来它是一种一次性的情况。
    【解决方案2】:

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

    解决方案非常简单。 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_exsists() 完全避免这种情况。我用你的答案来解决我的问题。谢谢。
    • 我不得不说,好的答案和 nikc 的答案在技术上肯定更正确,尤其是在处理错误方面。我想 Shrapnel 知道我只是搞砸了,如果我做对了就不需要处理任何错误 =)
    【解决方案3】:

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

    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() 函数不会启动整个其他程序。
    • 我从未对这种方法进行过基准测试,我怀疑您对时机的看法可能是正确的,但这篇文章与生产力无关。这篇文章是关于如何进行 try-catch-finally 友好的系统调用。
    • 除了为简单的系统调用分叉一个新进程之外,还有其他方法可以使其对 try-catch 友好。这很愚蠢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-25
    • 2016-02-29
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 2011-04-03
    相关资源
    最近更新 更多