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函数很好地处理。您自己无法模拟相同的行为(可能没有废话黑客)。因此,您被迫采用例外方式。

您应该注意一个例外:类型提示;只能与数组、类、对象和可调用对象(函数)一起使用:

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

如果使用任何其他类型的变量调用这些函数,则会像您发布的特定错误一样抱怨。

我之前谈到的 hack 可能包括自己重新定义每种类型:

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 回答