这可能是一个非常简单的问题,但我找不到任何关于它的信息。
我使用的系统聚合来自各种来源的大量数据,然后将这些数据存储在数据库中。在大多数情况下,系统工作正常,但偶尔我们会遇到一个问题,即数据可能有尴尬的字符编码(例如,当数据是另一种语言,如法语时),我们的系统不喜欢。
数据被传递到我们的处理服务器(我们使用Gearman),并且为了确保传递与源有关的所有信息,我们json_encode一个包含我们需要的所有内容的数组。我的问题是:如果我将json_encode包装在try / catch块中,会导致“PHP警告:json_encode():参数中的无效UTF-8序列”消息会触发catch块激活吗?
谢谢!
答案 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()); }