Я могу пробовать/ловить предупреждение?

Я должен поймать некоторые предупреждения, бросаемые от некоторых php собственных функций, и затем обработать их.

Конкретно:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

Это бросает предупреждение, когда запрос DNS перестал работать.

try/catch не работает, потому что предупреждение не является исключением.

У меня теперь есть 2 опции:

  1. set_error_handler походит на излишество, потому что я должен использовать его для фильтрации каждого предупреждения на странице (действительно ли это верно?);

  2. Скорректируйте сообщение об ошибке / дисплей, таким образом, эти предупреждения не становятся отраженными для экранирования, затем проверьте возвращаемое значение; если это false, никакие записи не найдены для имени хоста.

Какова лучшая практика здесь?

334
задан dreftymac 29 July 2019 в 12:29
поделиться

4 ответа

Установить и восстановить обработчик ошибок

Одна из возможностей - установить собственный обработчик ошибок перед вызовом и восстановить предыдущий обработчик ошибок позже с помощью restore_error_handler () .

set_error_handler(function() { /* ignore errors */ });
dns_get_record();
restore_error_handler();

Вы могли бы развить эту идею и написать повторно используемый обработчик ошибок, который регистрирует ошибки для вас.

set_error_handler([$logger, 'onSilencedError']);
dns_get_record();
restore_error_handler();

Преобразование ошибок в исключения

Вы можете использовать set_error_handler () и класс ErrorException , чтобы превратить все ошибки php в исключения.

set_error_handler(function($errno, $errstr, $errfile, $errline, $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    dns_get_record();
} catch (ErrorException $e) {
    // ...
}

при использовании собственного обработчика ошибок важно отметить, что он будет обходить параметр error_reporting и передавать все ошибки (уведомления, предупреждения и т. д.) в обработчик ошибок. Вы можете установить второй аргумент в set_error_handler () , чтобы определить, какие типы ошибок вы хотите получать, или получить доступ к текущим параметрам, используя ... = error_reporting () внутри обработчика ошибок.

Подавление предупреждения

Другая возможность - подавить вызов с помощью оператора @ и впоследствии проверить возвращаемое значение dns_get_record () . Но я бы не советовал это , поскольку ошибки / предупреждения запускаются для обработки, а не для подавления.

Подавление предупреждения

Другая возможность - подавить вызов с помощью оператора @ и впоследствии проверить возвращаемое значение dns_get_record () . Но я бы не советовал это , поскольку ошибки / предупреждения запускаются для обработки, а не для подавления.

Подавление предупреждения

Другая возможность - подавить вызов с помощью оператора @ и впоследствии проверить возвращаемое значение dns_get_record () . Но я бы не советовал это , поскольку ошибки / предупреждения запускаются для обработки, а не для подавления.

356
ответ дан 23 November 2019 в 00:43
поделиться

FolderStructure

index.php //Script File
logs //Folder for log Every warning and Errors
CustomException.php //Custom exception File

CustomException.php

/**
* Custom error handler
*/
function handleError($code, $description, $file = null, $line = null, $context = null) {
    $displayErrors = ini_get("display_errors");;
    $displayErrors = strtolower($displayErrors);
    if (error_reporting() === 0 || $displayErrors === "on") {
        return false;
    }
    list($error, $log) = mapErrorCode($code);
    $data = array(
        'timestamp' => date("Y-m-d H:i:s:u", time()),
        'level' => $log,
        'code' => $code,
        'type' => $error,
        'description' => $description,
        'file' => $file,
        'line' => $line,
        'context' => $context,
        'path' => $file,
        'message' => $error . ' (' . $code . '): ' . $description . ' in [' . $file . ', line ' . $line . ']'
    );
    $data = array_map('htmlentities',$data);
    return fileLog(json_encode($data));
}

/**
* This method is used to write data in file
* @param mixed $logData
* @param string $fileName
* @return boolean
*/
function fileLog($logData, $fileName = ERROR_LOG_FILE) {
    $fh = fopen($fileName, 'a+');
    if (is_array($logData)) {
        $logData = print_r($logData, 1);
    }
    $status = fwrite($fh, $logData . "\n");
    fclose($fh);
//    $file = file_get_contents($filename);
//    $content = '[' . $file .']';
//    file_put_contents($content); 
    return ($status) ? true : false;
}

/**
* Map an error code into an Error word, and log location.
*
* @param int $code Error code to map
* @return array Array of error word, and log location.
*/
function mapErrorCode($code) {
    $error = $log = null;
    switch ($code) {
        case E_PARSE:
        case E_ERROR:
        case E_CORE_ERROR:
        case E_COMPILE_ERROR:
        case E_USER_ERROR:
            $error = 'Fatal Error';
            $log = LOG_ERR;
            break;
        case E_WARNING:
        case E_USER_WARNING:
        case E_COMPILE_WARNING:
        case E_RECOVERABLE_ERROR:
            $error = 'Warning';
            $log = LOG_WARNING;
            break;
        case E_NOTICE:
        case E_USER_NOTICE:
            $error = 'Notice';
            $log = LOG_NOTICE;
            break;
        case E_STRICT:
            $error = 'Strict';
            $log = LOG_NOTICE;
            break;
        case E_DEPRECATED:
        case E_USER_DEPRECATED:
            $error = 'Deprecated';
            $log = LOG_NOTICE;
            break;
        default :
            break;
    }
    return array($error, $log);
}
//calling custom error handler
set_error_handler("handleError");

просто включают выше файла в Ваш файл сценария как это

index.php

error_reporting(E_ALL);
ini_set('display_errors', 'off');
define('ERROR_LOG_FILE', 'logs/app_errors.log');

include_once 'CustomException.php';
echo $a; // here undefined variable warning will be logged into logs/app_errors.log
0
ответ дан 23 November 2019 в 00:43
поделиться
  • Вы не можете определять полнотекстовые индексы (или любые другие индексы) для нескольких таблиц в MySQL. Каждое определение индекса ссылается только на одну таблицу. Все столбцы в заданном полнотекстовом индексе должны быть из одной и той же таблицы.

  • Столбцы, названные в качестве аргументов функции MATCH () , должны быть частью одного полнотекстового индекса. Вы не можете использовать один вызов MATCH () для поиска по всем столбцам, которые являются частью всех полнотекстовых индексов в вашей базе данных.

  • Полнотекстовые индексы только индексируют столбцы, определенные с помощью CHAR , VARCHAR и TEXT типы данных.

4
ответ дан 23 November 2019 в 00:43
поделиться

Если dns_get_record () завершается неудачно, он должен вернуть FALSE , поэтому вы можете подавить предупреждение с помощью @ , а затем проверить возвращаемое значение.

2
ответ дан 23 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: