Php json decode try catch

Исключения — PHP: Введение в ООП

Отдельная большая тема в программировании – обработка ошибок. До сих пор нам удавалось избегать её, но в реальном мире, где приложения содержат тысячи, десятки и сотни тысяч (а то и все миллионы) строк кода, обработка ошибок влияет на многое: простоту модификации и расширения, адекватное поведение программы для пользователя в разных ситуациях.

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

В PHP есть функция, которая называется strpos($text, $substr) . Она ищет подстроку $substr внутри текста $text и возвращает индекс начала этой подстроки в тексте. Что произойдёт, если подстрока не была найдена? Является ли это поведение ошибкой? Нет. Это штатное поведение функции. От того, что подстрока не была найдена, ничего страшного не случилось. Представьте себе любой редактор текста и механизм поиска внутри него. Ситуация, когда ничего не было найдено, возникает постоянно, и это не ломает работу программы.

Кстати, посмотрите в документацию этой функции, каким образом она говорит о том, что подстрока не была найдена?

Другая ситуация. В тех же редакторах есть функция «открыть файл». Представьте, что во время открытия файла, что-то пошло не так, например, его удалили. А это ошибка или нет? Да, в этой ситуации произошла ошибка, но это не ошибка программирования. Подобная ошибка может возникнуть всегда, независимо от желания программиста. Он не может избежать её появления. Единственное что он может, правильно реализовать её обработку.

Читайте также:  Html file editor online

Ещё один интересный вопрос, насколько это критичная ошибка? Должно ли оно приводить к остановке всего приложения или нет? В плохо написанных приложениях, там, где неправильно реализована обработка ошибок, такая ситуация приведёт к краху всего приложения, и оно завершится. В хорошо написанном приложении не произойдёт ничего страшного. Пользователь увидит предупреждение о том, что файл не читается, и сможет выбрать дальнейшие действия, например, попытаться прочитать его снова или выполнить другое действие.

Сказанное выше имеет очень серьёзные следствия. Одна и та же ситуация на разных уровнях может как являться ошибкой, так и быть вполне штатной ситуацией. Например, если задача функции читать файл, а она не смогла этого сделать, то с точки зрения этой функции произошла ошибка. Должна ли она приводить к остановке всего приложения? Как мы выяснили выше – не должна. О том, насколько критична данная ситуация, может решать приложение, которое использует эту функцию, но не сама функция.

Коды возврата

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

int write_log()  int ret = 0; // return value 0 if success FILE *f = fopen("logfile.txt", "w+"); // Проверяем, получилось ли открыть файл if (!f) return -1; // Проверяем, что не достигли конца файла if (fputs("hello logfile!", f) != EOF)  // continue using the file resource > else  // Файл закончился ret = -2; > // Не получилось закрыть файл if (fclose(f) == EOF) ret = -3; return ret; > 

Обратите внимание на условные конструкции и постоянное присваивание переменной ret . Фактически каждая потенциально опасная операция, должна проверяться на успешность выполнения. Если что-то пошло не так, то функция возвращает специальный код.

И вот тут начинаются проблемы. Как показывает жизнь, в большинстве ситуаций ошибка обрабатывается не там где она возникла и даже не уровнем выше. Предположим, что есть функция A, которая вызывает код, потенциально приводящий к ошибке, и она его должна уметь правильно обработать и сообщить пользователю о проблеме. При этом сама ошибка происходит внутри функции E, которая вызывается внутри A не напрямую, а через цепочку функций: A => B => C => D => E. Подумайте, к чему приводит такая схема? Все функции в этой цепочке, даже несмотря на то, что они не обрабатывают ошибку, обязаны знать про неё, отлавливать её и так же возвращать наружу код этой ошибки. В результате, количества кода, который занимается ошибками, становится так много, что за ним теряется код, выполняющий исходную задачу.

Стоит сказать, что существуют схемы обработки ошибок, которые не обладают такими недостатками, но работают по принципу возврата. Например монада Either.

Исключения

Именно на этом фоне и возник механизм исключений. Его главная цель, передать ошибку из того места, где она возникла, в место, где её можно обработать, минуя все промежуточные уровни. Другими словами, механизм исключений раскручивает стек вызовов самостоятельно.

С исключениями нужно запомнить две вещи: код, в котором произошла ошибка, выбрасывает исключение, а код, в котором ошибка обрабатывается – её ловит.

 // Функция, которая может выбросить исключение function readFile($filepath)  if (!is_readable($filepath))  throw new \Exception("'$filepath>' is not readable"); > // . > // Где-то в другом месте программы function run($filepath)  try  // Функция, которая вызывает readFile. Возможно не напрямую, а через другие функции. // Для механизма исключений это не важно. openFile($filepath); > catch (\Exception $e)  // Этот блок выполняется только в одном случае, если в блоке try было выброшено исключение showErrorToUser($e); > // Если тут будет код, он продолжит выполняться > 

Сами исключения – это объекты класса \Exception и его наследников (о наследовании в одном из следующих курсов). Этот объект содержит внутри себя сообщение, переданное в конструктор, трассировка стека и другие полезные данные:

 class Exception implements Throwable  protected $message = 'Unknown exception'; private $string; protected $code = 0; protected $file; protected $line; private $trace; private $previous; public function __construct($message = '', $code = 0, Throwable $previous = null); final private function __clone(); final public function getMessage(); final public function getCode(); final public function getFile(); final public function getLine(); final public function getTrace(); final public function getPrevious(); final public function getTraceAsString(); public function __toString(); > 

Выбросить исключение проще простого, достаточно использовать инструкцию throw :

 $e = new \Exception('Тут любой текст'); throw $e; // Исключение можно создать отдельно, а можно сразу же там, где используется throw 

throw прерывает дальнейшее выполнение кода. В этом смысле оно подобно return , но в отличие от него, прерывает выполнение не только текущей функции, но и всего кода, вплоть до ближайшего в стеке вызовов блока catch .

Блок try/catch обычно ставится на самом верхнем уровне программы, но это не обязательно. Вполне вероятно, что есть несколько промежуточных блоков, которые могут отлавливать ошибки и снова их возбуждать. Эта тема достаточно сложная и требует некоторого опыта работы.

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Источник

How handling error of JSON decode by try and catch

Solution 3: I solved this issue adding stripslashes to the string, before json_decode. Solution 4: To put all things together here and there, I’ve prepared json wrapper with decoding auto corrective actions. Code like this will work though: But not like this (another recursive reference): Recursive reference means that the reference points to a variable that in turn contains the same reference again.

How handling error of JSON decode by try and catch

I am unable to handle JSON decode errors. Here is my code:

try < $jsonData = file_get_contents($filePath) . ']'; $jsonObj = json_decode($jsonData, true); >catch (Exception $e) < echo 'getMessage() . ' ~' . $filePath . '">'; > 

I am a new PHP programmer. Sorry, if something is wrong.

Another way to handle json decode error:-

if ($jsonObj === null && json_last_error() !== JSON_ERROR_NONE)

Since PHP 7.3 one can use the JSON_THROW_ON_ERROR constant.

May be you can try, validating json_decode

try < $jsonData = file_get_contents($filePath) . ']'; $jsonObj = json_decode($jsonData, true); if (is_null($jsonObj)) < throw ('Error'); >> catch (Exception $e) < echo 'getMessage() . ' ~' . $filePath . '">'; > 

json_decode returns null when a error occurs, like no valid json or exceeded depth size. So basically you just check with if whether the jsondata you obtained is null or not. If it is, use json_last_error to see what went wrong, if not then continue with the script.

$json_data = json_decode($source, true); if($json_data == null)< echo json_last_error() . "
"; echo $source; // good to check what the source was, to see where it went wrong >else < //continue with script >

Something like that should work.

Php — What does JSON_ERROR_RECURSION mean from, JSON_ERROR_RECURSION (integer) The object or array passed to json_encode () include recursive references and cannot be encoded. If the JSON_PARTIAL_OUTPUT_ON_ERROR option was given, NULL will be encoded in the place of the recursive reference. This constant is available as of PHP 5.5.0. – …

Json_decode returns JSON_ERROR_SYNTAX but online formatter says the JSON is OK

I got a very strange problem.

When i check it with this website http://www.freeformatter.com/json-formatter.html#ad-output

But when i load my JSON with this code :

 $data = file_get_contents('http://www.mywebservice'); if(!empty($data))

I got the error : SYNTAX ERROR

WHICH IS NOT HELP FULL AT ALL.

I see that with PHP 5.5 i could use this function : http://php.net/manual/en/function.json-last-error-msg.php

(but i did not succeed to install PHP 5.5 yet, and i m not sure this function will give me more detail)

I faced the same issue, actually there are some hidden characters unseen and you need to remove it. Here’s a global code that works for many cases:

 $checkLogin = str_replace(chr(127), "", $checkLogin); // This is the most common part // Some file begins with 'efbbbf' to mark the beginning of the file. (binary level) // here we detect it and we remove it, basically it's the first 3 characters if (0 === strpos(bin2hex($checkLogin), 'efbbbf')) < $checkLogin = substr($checkLogin, 3); >$checkLogin = json_decode( $checkLogin ); print_r($checkLogin); ?> 

Removing the BOM (Byte Order Mark) is often-times the solution you need:

function removeBOM($data) < if (0 === strpos(bin2hex($data), 'efbbbf')) < return substr($data, 3); >return $data; > 

You shouldn’t have a BOM, but if it’s there, it is invisible so you won’t see it!!

use BOM Cleaner if you have lot’s of files to fix.

I solved this issue adding stripslashes to the string, before json_decode.

$data = stripslashes($data); $obj = json_decode($data); 

To put all things together here and there, I’ve prepared json wrapper with decoding auto corrective actions. Most recent version can be found in my GitHub Gist.

abstract class Json < public static function getLastError($asString = FALSE) < $lastError = \json_last_error(); if (!$asString) return $lastError; // Define the errors. $constants = \get_defined_constants(TRUE); $errorStrings = array(); foreach ($constants["json"] as $name =>$value) if (!strncmp($name, "JSON_ERROR_", 11)) $errorStrings[$value] = $name; return isset($errorStrings[$lastError]) ? $errorStrings[$lastError] : FALSE; > public static function getLastErrorMessage() < return \json_last_error_msg(); >public static function clean($jsonString) < if (!is_string($jsonString) || !$jsonString) return ''; // Remove unsupported characters // Check http://www.php.net/chr for details for ($i = 0; $i public static function encode($value, $options = 0, $depth = 512) < return \json_encode($value, $options, $depth); >public static function decode($jsonString, $asArray = TRUE, $depth = 512, $options = JSON_BIGINT_AS_STRING) < if (!is_string($jsonString) || !$jsonString) return NULL; $result = \json_decode($jsonString, $asArray, $depth, $options); if ($result === NULL) switch (self::getLastError()) < case JSON_ERROR_SYNTAX : // Try to clean json string if syntax error occured $jsonString = self::clean($jsonString); $result = \json_decode($jsonString, $asArray, $depth, $options); break; default: // Unsupported error >return $result; > > 
$json_data = file_get_contents("test.json"); $array = Json::decode($json_data, TRUE); var_dump($array); echo "Last error (" , Json::getLastError() , "): ", Json::getLastError(TRUE), PHP_EOL; 

Org.openqa.selenium.json.JsonException: Unable to, Teams. Q&A for work. Connect and share knowledge within a single location that is structured and easy to search. Learn more

What does JSON_ERROR_RECURSION mean from json_encode?

I get this error on PHP7 every about 100 requests for some odd reason and I cannot get rid of it until I restart the fpm demon, however, the real problem is I cannot explain what the error is to start diagnosing this.

I took a look at the documentation http://php.net/manual/en/function.json-last-error.php which was not very useful and there does not seem to be any real links hanging about.

I know this error is not actually related to recursion depth ( JSON_ERROR_DEPTH ) so what does this error actually mean?

This is the var_dump() of the array that is failing:

 array ( 'ns' => 'user', 'where' => '', 'projection' => array ( ), 'sort' => array ( ), 'limit' => NULL, 'skip' => NULL, ) 

JSON_ERROR_RECURSION indicates that the data passed to json_encode() contains one or more recursive references.

Code like this will work though:

But not like this (another recursive reference):

Recursive reference means that the reference points to a variable that in turn contains the same reference again.

Most likely need to update mongodb driver (or maybe another extension). Extension with bug may write to shared memory (immutable arrays) — it is not allowed.

It is can be detected with opcache.protect_memory (http://php.net/manual/en/opcache.configuration.php#ini.opcache.protect-memory)

Php — JSON control character error, without a control, Im using JSON to transfer data from my server to my client and vice versa. I compress chat message strings with LZString to save space. This works fine, except for 4 character messages (so «abcd», «xyzs» etc). Everything works fine, but the JSON doesn’t get decoded correctly. My PHP code (checked via …

Источник

Оцените статью