Это, наверное, очень простой вопрос, но я просто не могу найти информацию об этом.
Я работаю с системой, которая объединяет множество данных из разных источников и затем сохраняет эти данные в базе данных. По большей части система работает нормально, но иногда мы получаем проблему, когда данные могут иметь неудобную кодировку символов (например, когда данные находятся на другом языке, например, на французском языке), что наша система не нравится.
Данные передаются на наш сервер обработки (мы используем Gearman), и чтобы вся информация, относящаяся к источнику, передавалась, мы json_encode массива со всем, что нам нужно. Мой вопрос к вам: если я обернуть json_encode в блок try / catch, будут ли вещи, вызывающие «PHP Warning: json_encode (): недопустимая последовательность UTF-8 в аргументе», инициируют блокировку catch для активации?
Благодаря!
Нет, но вы можете проверить его возвращаемое значение в функции и выбросить исключение, если что-то пойдет не так. Вы также можете использовать json_last_error
для получения информации об ошибке
Пример:
function my_json_encode($data) { if( json_encode($data) === false ) { throw new Exception( json_last_error() ); } } try { my_json_encode($data); } catch(Exception $e ) { // do something }
Мне очень досадно, что для получения фактического сообщения об ошибке вам нужно проверить список констант, который возвращается из json_last_error()
. Раньше я использовал оператор switch / case, чтобы это произошло, но вы можете использовать разные исключения в зависимости от ошибки.
Не изначально, вам нужно будет настроить некоторые ошибки обработки ошибок.
<?php function exception_error_handler($errno, $errstr, $errfile, $errline) { throw new ErrorException($errstr, $errno, 0, $errfile, $errline); } set_error_handler('exception_error_handler');
Тогда вы можете сделать:
try { json_encode(...); } catch (ErrorException $e) { // do some thing with $e->getMessage() }
Но не забывайте, что это заставит все ошибки PHP вызывать исключение, поэтому вы должны точно настроить его на свои нужды.
Вы также можете выводить ошибки или показывать исключение на основе ошибок. Как см. Код ниже.
<?php protected static $_messages = array( JSON_ERROR_NONE => 'No error has occurred', JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded', JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON', JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded', JSON_ERROR_SYNTAX => 'Syntax error', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded' ); public static function encode($value, $options = 0) { $result = json_encode($value, $options); if($result) { return $result; } throw new RuntimeException(static::$_messages[json_last_error()]); } public static function decode($json, $assoc = false) { $result = json_decode($json, $assoc); if($result) { return $result; } throw new RuntimeException(static::$_messages[json_last_error()]); }