Php для цикла с попыткой поймать - PullRequest
1 голос
/ 20 сентября 2011

Этот вопрос является продолжением этого , как предложено одним из пользователей.

Я использую функцию getIDs, как показано ниже, для обработки идентификаторов.CheckValid () проверит, является ли идентификатор действительным для обработки, если да, то он перейдет к следующему updateUsers ().Check valid только проверяет условие и, если нет, выдает исключение.updateUsers () просто обновляет столбец, если он передает checkValid ().

Проблема - Если я получаю 4 идентификатора в качестве вывода из getIDs () и с execute (), то он обрабатывает 2, например, и если это не удаетсядля 2-го идентификатора он не продолжается для остальных 2-х идентификаторов. Я хочу, чтобы он продолжался, поэтому я закомментировал «throw $ e in catch».

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

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

Похоже, что вы используете исключения как логические значения, я бы посоветовал избегать этого, поскольку это быстро сбивает с толку, если только вам действительно не нужно содержимое исключения.Посмотрите, имеет ли это смысл для вашего варианта использования (я позволю, это может быть не так).

// 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() без параметров кажется очень плохой практикой.Гораздо лучше, например, перебрать список идентификаторов и проверить каждый идентификатор и пользователя по очереди, что-то вроде этого:

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
    }
}
1 голос
/ 20 сентября 2011

Вы пробовали просто продолжить в блоке 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;
    }
  }
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...