6

これはおそらく本当に単純な質問ですが、私はそれに関する情報を見つけることができません。

私は、さまざまなソースからの大量のデータを集約し、そのデータをデータベースに保存するシステムを使用しています。ほとんどの場合、システムは正常に動作しますが、システムが気に入らない文字エンコード(たとえば、データがフランス語などの別の言語である場合)がデータに含まれる場合があるという問題が発生することがあります。

データは処理サーバー(Gearmanを使用)に渡され、ソースに関連するすべての情報が確実に渡されるように、必要なものすべてを含む配列をjson_encodeします。あなたへの私の質問は、json_encodeをtry / catchブロックでラップした場合、「PHP警告:json_encode():引数に無効なUTF-8シーケンス」メッセージが表示されると、catchブロックがアクティブになりますか?

ありがとう!

4

4 に答える 4

12

いいえ。ただし、関数で戻り値を確認し、問題が発生した場合は例外をスローできます。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ステートメントを使用しましたが、エラーに応じて異なる例外をスローする可能性があります。

于 2012-09-04T14:47:48.277 に答える
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エラーで例外がスローされるため、必要に応じて微調整する必要があります。

于 2012-09-04T14:42:24.720 に答える
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()]);
}
于 2017-08-25T07:27:49.027 に答える
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()); }
于 2020-08-22T18:59:43.987 に答える