0

次のような例外をスローします。

public function findRole($role)
{
    if(!is_string($role)){
        throw new \InvalidArgumentException(
            sprintf('Role should be a string, %s given.', gettype($role))
        );
    //...
    }

私はこのようないくつかの例外を見てきましたが、同じことをしたいと思います:

エラー: json_decode() は、パラメーター 1 が文字列であると想定しており、配列が指定されています。

このような例外を自動的にスローして、例外が関数の名前無効な引数番号を自動的に出力する可能性はありますか?

4

3 に答える 3

1

自動的ではありませんが、たとえば次のような汎用テンプレートを作成できます。

if(!is_string($role)) {
    throw create_invalid_argument_exception(__METHOD__, 1, 'string', $role);
}



function create_invalid-argument_exception($method, $argNo, $expectedType, $actualValue) {
    return new \InvalidArgumentException(
        sprintf(
            '%s expects parameter %d to be %s, %s given.',
            $method, $argNo, $expectedType, gettype($actualValue)
        )
    );
}
于 2013-02-12T14:33:55.123 に答える
1

必要なエラーは PHP によって自動的に出力され、おそらくset_error_handler関数で適切に処理されます。同じ動作を自分でシミュレートする方法はありません (おそらく無意味なハックがなければ)。したがって、あなたは例外的な方法で行くことを余儀なくされています。

注意すべき例外があります。配列、クラス、オブジェクト、および callable (関数) でのみ使用できます。

public function acceptArray(array $array);
public function acceptObject(object $o);
public function acceptClass(MyClass $o);
public function acceptCallback(callable $f);

これらの関数は、他のタイプの変数で呼び出された場合、投稿した特定のエラーとほぼ同じように文句を言います。

先ほど話したハックには、すべての型を自分で再定義することが含まれる場合があります。

class Int {...}
class String {...}
class Float {...}
class Bool {...}

そして、そのように使用します:

$bool = new Bool(true);
acceptString($bool); // public function acceptString(String $s);

エラーが発生します。しかし、それはPHP の本来の動作方法ではありません。したがって、最初のアイデアをそのまま使用することをお勧めします。

于 2013-02-12T14:35:03.537 に答える
-1

例外をキャッチするには、次の構造を使用する必要があります。

try{
    /** you code here  */
}catch(Exception $e){
    /** convert $e to json and output */
}

そしてそれであなたの主な機能を包みます

于 2013-02-12T14:24:53.023 に答える