我有一个在实例化时接受用户ID的类。当数据库中不存在该ID时,它将引发异常。这是:
class UserModel {
protected $properties = array();
public function __construct($id=null) {
$user = // Database lookup for user with that ID...
if (!$user) {
throw new Exception('User not found.');
}
}
}
我的客户端代码如下所示:
try {
$user = new UserModel(123);
} catch (Exception $e) {
$user = new UserModel();
// Assign values to $user->properties and then save...
}
它只是试图找出用户是否存在,否则会创建一个新用户。它有效,但我不确定它是否合适?如果没有,请提供解决方案。
答案 0 :(得分:2)
这不是正确的,尝试使用catch块来处理可能发生异常环境的代码。在这里,您只是检查用户是否存在,所以最好的方法是使用简单的if else。
from wikipedia definition of programing expception:
"Exception: an abnormal event occurring during the execution of a
routine (that routine is the "recipient" of the exception) during its execution.
Such an abnormal event results from the failure of an operation called by
the routine."
答案 1 :(得分:1)
这是有争议的,但我会说这不合适。之前已经讨论过了。看到 Is it "bad" to use try-catch for flow control in .NET?
答案 2 :(得分:1)
这似乎是一种正确的行为,只要它在$id
为null
时不会抛出(这样,你可以假设要创建一个新行为)。
对于使用您的类的代码,如果您稍后要使用相同的ID插入它,只需将其插入该ID即可开始而不进行检查 - 尽管不太可能,但是检查和插入之间发生了一些事情。 (MySQL有ON DUPLICATE KEY UPDATE
。)
答案 3 :(得分:1)
当@VictorEloy和@AIW回答时,不建议对流控制使用异常。
作为补充,在您的情况下,我可能会坚持使用静态方法来查找现有用户,如果找到则会返回UserModel
的实例,如果不找到则返回null
。这种方法用于某些ORM库,例如来自Active Record的Ruby on Rails和来自Eloquent的Laravel。
class UserModel {
protected $properties = array();
public static function find($id) {
$user = // Database lookup for user with that ID...
if ($user) {
return new UserModel($user); // ...supposing $user is an array with its properties
} else {
return null;
}
}
public function __construct($properties = array()) {
$this->properties = $properties;
}
}
$user = UserModel::find(5);
if (!$user)
$user = new UserModel();