PHP异常参数

时间:2016-03-21 11:34:37

标签: php dynamic-sql atk4

我正在开发一个PHP library,它可以在不同的环境中被不同的PHP项目使用,并且我试图尽可能简约。

在某些情况下,我必须抛出异常,例如。

throw Exception('template has invalid tag');

如果没有标签的名称,这样的错误就没有用了:

throw Exception('template has invalid tag: '.$tag);

这将很难本地化,并可能导致各种注射问题。

问题:在PHP中使用Exception传递额外变量的最佳方法是什么?

(注意:我的库执行SQL查询构建,我希望它专注于任务,而不是解决异常问题)

3 个答案:

答案 0 :(得分:4)

国际化不是您图书馆的责任。为您的项目创建一个或多个Exception类(不推荐抛出\Exception,因为它过于通用)并让它们将参数存储在属性中。

将错误消息设置为现在,但也将值作为参数传递给新异常的构造函数。为他们提供吸气剂。错误消息是供开发人员使用的。使用您的库的代码必须捕获异常并显示适合它们的错误消息。无论如何,它们不应显示您提供的原始消息。

例如,您在库中声明:

class InvalidTagException extends \Exception
{
    protected $tag;

    public function __construct($message, $tag, $code = 0, Throwable $previous = NULL)
    {
        // Let the parent class initialize its members
        parent::__construct($message, $code, $previous);
        // Initialize own members
        $this->tag = $tag;
    }

    public function getTag()
    {
        return $tag;
    }
}

// Declare other Exception classes in a similar fashion, for each kind of exception you throw
class InvalidValueException extends \Exception
{
    // ...
}

使用您的库的应用程序:

try {
    // call your library code here
} catch (InvalidTagException $e) {
    // Handle in application specific way

} catch (InvalidValueException $e) {
    // A different type of exception requires a different type of handling
}

答案 1 :(得分:3)

您可以定义自己的异常类,并在构造函数中添加变量。

例如:

class AnswerException extends \Exception
{
    protected $group;
    public function __construct($message = "",  $group = null, $code = 0, \Exception $previous = null){
        $this->group = $group;
        return parent::__construct($message, $code, $previous);
    }
    public function getGroup(){
        return $this->group;
    }
}

在这种情况下,您可以使用以下语法抛出异常:

throw new AnswerException('template has invalid tag',$tag);

然后,您可以抓住AnswerException并使用$exception->getGroup()功能。

答案 2 :(得分:1)

一种可能的解决方案是使用sprintf,如下所示:

throw new Exception(sprintf(_('template has invalid tag %s'), $tag));

其中_()是您的本地化功能。

但这不是最好的解决方案,因为它仍然可以打开html注入,当你有5个变量通过时会变得非常混乱。就我所见,Wordpress使用这种本地化方法。