使用try / catch就像/ else一样?

时间:2013-11-22 02:43:56

标签: php exception try-catch

我有一个在实例化时接受用户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...
}

它只是试图找出用户是否存在,否则会创建一个新用户。它有效,但我不确定它是否合适?如果没有,请提供解决方案。

4 个答案:

答案 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)

这似乎是一种正确的行为,只要它在$idnull时不会抛出(这样,你可以假设要创建一个新行为)。

对于使用您的类的代码,如果您稍后要使用相同的ID插入它,只需将其插入该ID即可开始而不进行检查 - 尽管不太可能,但是检查和插入之间发生了一些事情。 (MySQL有ON DUPLICATE KEY UPDATE。)

答案 3 :(得分:1)

当@VictorEloy和@AIW回答时,不建议对流控制使用异常。

作为补充,在您的情况下,我可能会坚持使用静态方法来查找现有用户,如果找到则会返回UserModel的实例,如果不找到则返回null。这种方法用于某些ORM库,例如来自Active RecordRuby on Rails和来自EloquentLaravel

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();