json_encode可以触发catch块吗?

时间:2012-09-04 14:38:41

标签: php json

这可能是一个非常简单的问题,但我找不到任何关于它的信息。

我使用的系统聚合来自各种来源的大量数据,然后将这些数据存储在数据库中。在大多数情况下,系统工作正常,但偶尔我们会遇到一个问题,即数据可能有尴尬的字符编码(例如,当数据是另一种语言,如法语时),我们的系统不喜欢。

数据被传递到我们的处理服务器(我们使用Gearman),并且为了确保传递与源有关的所有信息,我们json_encode一个包含我们需要的所有内容的数组。我的问题是:如果我将json_encode包装在try / catch块中,会导致“PHP警告:json_encode():参数中的无效UTF-8序列”消息会触发catch块激活吗?

谢谢!

4 个答案:

答案 0 :(得分:7)

不,但你可以检查它在函数中的返回值,并在出现问题时抛出异常。您还可以使用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语句来实现这一点,但是你可以根据错误抛出不同的异常。

答案 1 :(得分:1)

非本机,您需要设置一些自定义错误处理。

<?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错误抛出异常,因此您应该根据需要对其进行微调。

答案 2 :(得分:1)

您还可以输出错误或根据错误显示异常。请参阅下面的代码。

<?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()]);
}

答案 3 :(得分:0)

从PHP 7.3开始,您可以使用JSON_THROW_ON_ERROR选项。在PHP 5.5中,他们将json_encode的错误返回值从null更改为false。这是一个涵盖各种PHP版本的解决方案。

function callJSONFunc($jsonFuncName, $args) {
    if (defined('JSON_THROW_ON_ERROR')) {
        $args[1] = $args || JSON_THROW_ON_ERROR;
    }
    $ret = call_user_func_array($jsonFuncName, $args);
    if (!defined('JSON_THROW_ON_ERROR')) {
        if ($ret === false || $ret === null) {
            throw new JSONException(json_last_error_msg());
        }
    }
    return $ret;
}

class JSONException extends Exception {}

function decodeJSON() { return callJSONFunc('json_decode', func_get_args()); }
function encodeJSON() { return callJSONFunc('json_encode', func_get_args()); }