Php mkdir()异常处理

Php mkdir()异常处理,php,exception-handling,mkdir,Php,Exception Handling,Mkdir,mkdir()工作正常这个问题更多的是关于捕获错误。当目录存在时,我不想打印它,我只想让它在自定义日志中写入给我的消息。如何创建此异常 警告:mkdir()[function.mkdir]:文件存在您可以通过使用设置全局(在配置或运行时)抑制错误消息,或通过在函数调用前加上@-字符,逐案停止显示错误消息。(例如,@mkdir(“…”)) 然后,当mkdir返回false时,您可以使用进行检查 对于错误日志记录,应用全局规则。您可以使用手动记录错误 如需进一步阅读,请参阅上的手册部分 编辑: 正如

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


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

您可以通过使用设置全局(在配置或运行时)抑制错误消息,或通过在函数调用前加上
@
-字符,逐案停止显示错误消息。(例如,
@mkdir(“…”)

然后,当
mkdir
返回
false
时,您可以使用进行检查

对于错误日志记录,应用全局规则。您可以使用手动记录错误

如需进一步阅读,请参阅上的手册部分

编辑:

正如评论中所建议的,自定义错误处理程序也是一种可能的、可以说更健壮(取决于您的实现)但肯定更优雅的解决方案

function err_handler($errno, $errstr) {
    // Ignore or log error here
}

set_error_handler('err_handler');
这样,错误消息将不会显示,除非您显式地回显它。但是请注意,当使用自定义错误处理程序时,
error\u get\u last
将返回
NULL

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

解决办法很简单。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*/}

您可以使用如下类重写任何系统调用函数:

文件: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);
    }

}
namespace abc;
require 'system.php';

try {
    System::makeDirectory($directoryName);
} catch (\Exception $e) {
    throw new \Exception($e->getMessage(), System::CAN_NOT_MAKE_DIRECTORY);
} 
然后可以调用该方法并截获异常:

文件:index.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);
    }

}
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{…}
正常处理所有系统错误。

我应该指出,在否决表决时进行评论是一种良好的做法,也是一种建设性的做法。(更不用说礼貌了)我没有投你反对票,但也许是因为有人看到了接线员,认为这是不好的做法?(我自己也建议使用自定义错误处理程序,使用
set\u error\u handler
,但我认为这个答案仍然非常有效和有用。)事实上,自定义错误处理程序将是一个更优雅的解决方案。但在上述情况下,我认为接线员是一个可以接受的解决方案,因为在我看来,这是一种一次性的情况,你明白了我的意图。我可以使用file_exsists()完全避免这种情况。我用你的答案解决了我的问题。谢谢。我必须说,good的答案和nikc的答案在技术上肯定更正确,尤其是在处理错误方面。我想“弹片”知道我只是搞砸了,如果我做对了,就不需要处理任何错误了=)这是一种缓慢的方法。
mkdir()
函数不会启动整个其他程序。我从来没有对这种方法进行过基准测试,我怀疑你在时间上可能是对的,但这篇文章不是关于生产率的。这篇文章是关于如何使try-catch-finally友好的系统调用。除了为一个简单的系统调用派生一个新进程外,还有其他方法可以使try-catch友好。这很愚蠢。