Php for循环与try catch

时间:2011-09-20 14:31:39

标签: php for-loop

根据其中一位用户的建议,此问题将继续this

我正在使用如下的getIDs函数来处理id。 CheckValid()将检查id是否是一个有效的id,如果是,那么它将转到下一个updateUsers()。检查有效只检查条件,如果不检查则抛出异常。 updateUsers()只是在通过checkValid()时更新列。

问题 - 如果我从getIDs()和execute()获得4个id作为输出,例如它处理2,如果第2个id失败,则不会继续其余的2个ID。希望它继续,所以我注释掉了“在catch块中抛出$ e”。

Function execute() { 
 for($i=0 ; $i<count($this->getIDs()); $i++) { 
try {
 $this->checkValid();
 $this->updateUsers(); 
} catch(Exception $e) {
  //throw $e;
}

2 个答案:

答案 0 :(得分:1)

您是否尝试在catch块中进行简单的继续?没有测试,但可能是这样的:

Function execute() { 
 for($i=0 ; $i<count($this->getIDs()); $i++) { 
    try {
     $this->checkValid();
     $this->updateUsers(); 
    } catch(Exception $e) {
     //throw $e;
     continue; // if not working try a continue 2;
    }
  }
} 

答案 1 :(得分:1)

听起来你正在使用异常作为布尔值,我建议避免这样做,因为它很快就会引起混淆,除非你真的需要异常的内容。看看这对你的用例是否有意义(我会批准,但可能不会)。

// returns true if valid, false otherwise
function checkValid(){
    try {
        // do your validation
        return true;
    } catch (Exception $e) {
        // optional: save the exception in case we want to know about it
        $this->last_error = $e;
        return false;
    }
}

function execute() { 
    for($i=0 ; $i<count($this->getIDs()); $i++) { 
        if($this->checkValid()){
            $this->updateUsers();
        }
        // if you want to do something with an error, simply add an else clause
        // and handle $this->last_error
    }
}

此外,我显然不知道您的代码或您正在做什么,但循环n次并且在没有参数的情况下调用checkValid()updateUsers()似乎非常糟糕。例如,更好地循环遍历ID列表并依次检查每个ID和用户,如下所示:

foreach($this->getIDs() as $id){
    if($this->checkValid($id)){
        $this->updateUser($id);
    } else {
        // an advantage of this is now we can know exactly which ID failed,
        // because we have the $id variable
    }
}