Php mkdir () обработка исключений - PullRequest
4 голосов
/ 21 апреля 2010

mkdir () работает правильно, этот вопрос больше относится к обнаружению ошибки. Вместо того, чтобы печатать это, когда каталог существует, я просто хотел бы, чтобы он записал мне сообщение в специальном журнале. Как мне создать это исключение.

Предупреждение: mkdir () [function.mkdir]: файл существует

Ответы [ 3 ]

10 голосов
/ 21 апреля 2010

Я просто хотел бы, чтобы он написал мне сообщение в пользовательском журнале.

решение очень простое.В 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*/}
3 голосов
/ 15 августа 2017

Вы можете переписать любую функцию системного вызова с помощью такого класса:

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

2 голосов
/ 21 апреля 2010

Вы можете остановить отображение сообщения об ошибке, подавив сообщения об ошибках глобально (в конфигурации или во время выполнения) с помощью параметра display_errors, или в каждом конкретном случае, добавив префикс функции к @ -персонаж. (Например, @mkdir('...')).

Затем вы можете проверить с помощью error_get_last, когда mkdir вернет false.

Для регистрации ошибок применяются глобальные правила. Вы можете регистрировать ошибки вручную с помощью error_log.

Подробнее см. В разделе руководства по Обработка ошибок .

Edit:

Как предлагается в комментариях, пользовательский обработчик ошибок также является возможным, возможно, более надежным (в зависимости от вашей реализации), но, безусловно, более элегантным решением.

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

set_error_handler('err_handler');

Таким образом, сообщение об ошибке не будет отображаться, если вы явно не отобразите его. Обратите внимание, что при использовании пользовательского обработчика ошибок error_get_last вернет NULL.

...