Вопрос

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