Как найти причину сбоя mkdir в PHP? - PullRequest
17 голосов
/ 29 мая 2009

Функция PHP mkdir возвращает только true и false. Проблема в том, когда он возвращает ложь.

Если я работаю с включенным отчетом об ошибках, я вижу сообщение об ошибке на экране. Я также вижу сообщение об ошибке в журнале Apache. Но я хотел бы взять текст сообщения и сделать с ним что-то еще (например, отправить мне через IM). Как я могу получить текст ошибки?

Обновление: Следуя идее Аймана, я пришел к этому:

function error_handler($errno, $errstr) {
    global $last_error;
    $last_error = $errstr;
}

set_error_handler('error_handler');
if (!mkdir('/somedir'))
    echo "MKDIR failed, reason: $last_error\n";
restore_error_handler();

Однако мне это не нравится, потому что в нем используется глобальная переменная. Есть идеи для более чистого решения?

Ответы [ 3 ]

52 голосов
/ 30 мая 2009

Вы можете подавить предупреждение и использовать error_get_last():

if (!@mkdir($dir)) {
    $error = error_get_last();
    echo $error['message'];
}
16 голосов
/ 30 мая 2009

Вы можете использовать исключения:

Настройте некоторый код следующим образом:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
set_error_handler("exception_error_handler");

А потом просто сделай:

try {
   mkdir('/somedir');
} catch(ErrorException $ex) {
   echo "Error: " . $ex->getMessage();
}

Это должно делать то, что вы хотите.

Если вы хотите сохранить обработчик ошибок php, то после этого попытайтесь перехватить блок, просто позвоните:

restore_error_handler()
3 голосов
/ 25 марта 2013

Я использую что-то вроде следующего:

if(! @mkdir('$fileLocation', 0777, $recursive = true)){
    $mkdirErrorArray = error_get_last();
    throw new Exception('cant create directory ' .$mkdirErrorArray['message'], 1);
}
...