异常

时间:2015-10-11 16:33:13

标签: php exception

我收到以下错误消息:

  

Exception的参数错误([string $ exception [,long $ code [,Exception $ previous = NULL]]])

这是我的代码:

class DAOException extends Exception {

function __construct($message, $code = 0, Exception $previous = null){
    parent::__construct($message, $code, $previous);
}

我尝试自己制作异常,但它一直说我在这一行有错误:

parent::__construct($message, $code, $previous).

以下是我可以调用此异常的示例:

public function add(FilmDTO $filmDTO){
        try{
            $addPreparedStatement = parent::getConnection()->prepare(FilmDAO::ADD_REQUEST);
            $addPreparedStatement->bindParam(':titre', $filmDTO->getTitre());
            $addPreparedStatement->bindParam(':duree', $filmDTO->getDuree());
            $addPreparedStatement->bindParam(':realisateur', $filmDTO->getRealisateur());
            $addPreparedStatement->execute();
        } catch(PDOException $pdoException){
            throw new DAOException($pdoException->getMessage(), $pdoException->getCode(), $pdoException);
        }

    }

2 个答案:

答案 0 :(得分:1)

这是因为PDO异常可以有一个字母数字的代码,而异常只能有一个整数代码。因此,在DAO构造函数中,您将已经给出的代码(PDO代码 - 字符串)传递给异常构造,它没有它。

您可以通过将代码转换为DAOException构造函数中的整数来解决此问题。如果您需要完整的字符串代码(我不确定它是否为您提供了更多有用的信息),您可以随时将其附加或添加到消息字符串中(同样,在DAOException构造函数中)

答案 1 :(得分:0)

The PDOException class :: getCode()可能返回字符串:

最终公共异常:: getCode(void):混合

它做到了,并且显示了错误代码,例如HY1234

filter_var函数与FILTER_SANITIZE_NUMBER_INT一起使用,以得到没有1234的代码HY。请记住,filter_var返回的字符串不是int,并且可能返回false,因此具有默认的异常代码,例如0,例如:

class DAOException extends Exception {

function __construct($message, $code = 0, Exception $previous = null){

    //exception code coversion
    $code = filter_var($code, \FILTER_SANITIZE_NUMBER_INT);
    if ($code === false) {
        $code = 0;
    } else {
        $code = (int) $code;
    }

    parent::__construct($message, $code, $previous);
}

错误代码的问题并不特定于PDO异常,但通常对于所有异常,请参见以下问题:

PHP Exception::getCode() contradicts Throwable interface that it implements