문제

mkdir() is working correctly this question is more about catching an error. Instead of printing this when the directory exists I would just like to have it write to a message to me in a custom log. How do I create this exception.

Warning: mkdir() [function.mkdir]: File exists

도움이 되었습니까?

해결책

I would just like to have it write to a message to me in a custom log.

the solution is very easy. PHP already have everything for you:

ini_set('display_errors',0);
ini_set('log_errors',1);
ini_set('error_log','/path/to/custom.log');

or same settings in the php.ini or .htaccess
I think it would be better than write each possible error manually

If you don't want this error to be logged (as it may be not error but part of application logic), you can check folder existence first

if (!file_exists($folder)) mkdir($folder);
else {/*take some appropriate action*/}

다른 팁

You can stop the error message from displaying either by suppressing error messages globally (in config or runtime) with the display_errors setting, or case by case by prefixing the function call with an @-character. (E.g. @mkdir('...')).

You can then check with error_get_last when mkdir returns false.

For error logging global rules apply. You can log errors manually with error_log.

For further reading, see the manual section on Error handling.

Edit:

As suggested in the comments, a custom error handler is also a possible, arguably more robust (depending on your implementation) but certainly more elegant, solution.

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

set_error_handler('err_handler');

This way, the error message will not display, unless you explicitly echo it. Note, though, when using a custom error handler error_get_last will return NULL.

You can rewrite any system call function with a class like this:

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);
    }

}

Then you can call the method and intercept the exception:

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);
} 

Now you can treat all the system errors with the try {...} catch(...) {...} finally {...} normally.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top