抛出例外

时间:2015-03-23 03:44:50

标签: php exception

我有一些问题,也会对我为这个函数编写代码的方式得到一些反馈;它验证给定的电子邮件是否已存在于数据库中并返回布尔值。

  /**
   * Validate user existence by email
   *
   * @param string $email
   *
   * @return boolean
   */    
public static function validateUserByEmail($email)
{
    if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
        throw new InvalidFormatException('An invalid email has been provided!', 100);
    }

    try {
        $connection = new Database();
    } catch(DatabasePDOException $e) {
        throw $e;
    }

    if($connection){
        $sql = 'SELECT count(1) AS existence
        FROM userprofile WHERE ename = ?';  
        $params = array($email);
        $response = $connection->selectPDOStatement($sql, $params);
    }

    if(isset($response)){
        return !!$response ? !!$response[0]['existence'] : false;
    } else {
        return false;
    }
}

我的疑虑/问题如下:

1)如果电子邮件格式无效,我是否应该抛出异常

if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
    throw new InvalidFormatException('An invalid email has been provided!', 100);
}

或者我应该只返回一个值?

if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
    return false;
}

2)如果我抛出一个异常,但我没有在父函数中捕获它们,我是否做错了?

public function parentFunction($string){
    if(validateUserByEmail($string)){
        // do something
    }
}

3)或者是完全没必要编写函数的方式?

1 个答案:

答案 0 :(得分:1)

  1. 为什么不呢?如果你需要获得更多关于发生的细节而不是简单的真/假 - 这是正常的。您也可以通过引用返回错误原因。好处 - 您不需要try/catch阻止,更高级别可以获取详细信息。例如。
  2. public static function validateUserByEmail($email, &$error_reason)
    {
        $result = true;
    
        if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
            $result = false;
            $error_reason = 'InvalidEmail';
        }
    
        ... 
    
        return $result;
    }
    
    1. 如果你没有更高级别的异常处理程序 - 这很糟糕。如果您编写面向用户的应用程序,您应该知道 - 用户不希望您的例外。 :)我可以说更多 - 他们不希望看到任何错误。但总是你应该为他们提供人类可读的信息。 如果您为自己编写一些应用程序 - 捕获异常会降低权重。但好消息,解释发生的事情会更好。