PHP исключения в цикле foreach - PullRequest
       26

PHP исключения в цикле foreach

2 голосов
/ 15 января 2012

Как правильно реализовать исключение php (try {} catch () {}) в цикле foreach, который выглядит следующим образом:

foreach ($apis as $api)
{                 
     $api = '_'.$api;
     $searchResults[$api] = $this->$api($parameters);
}

Я хочу реализовать исключения php, если один из $ this-> api (); возвращает сообщение об ошибке, затем перехватывает его и делает if внутри catch, чтобы отобразить правильное сообщение для возвращено сообщение об ошибке.

Edit: Кроме того, при захвате ошибки и если сообщение об ошибке равно 1 (например), это хороший способ сделать:

$searchResults['api'] = $this->_api($parameters);

поэтому он пытается выполнить функцию снова и посмотреть, принесет ли в этот раз действительные данные?

Ответы [ 3 ]

4 голосов
/ 15 января 2012
foreach ($apis as $api)
{                 
     $api = '_'.$api;
     try {
         $searchResults[$api] = $this->$api($parameters);
     }
     catch(ParameterException $e) {
         // parameterexception handling here
         echo "A ParameterException was thrown";
     }
     catch(Exception $e) {
         // All other exceptions
         echo "Some other Exception was thrown";
     }
}

Вы также можете различать больше типов исключений.

3 голосов
/ 15 января 2012

Поскольку блок catch будет выполняться только в случае исключения, на самом деле нет никакой разницы, заключаете ли вы цикл for-each внутри блока try или если вы помещаете try-catch в тело цикла.

Вы должны взять все, что добавляет ясности. Однако выполнение этого внутри цикла позволит вам обрабатывать более конкретные исключения, относящиеся к телу цикла, если в будущем возникнет такая необходимость.

Кроме того, так как исключения напечатаны, вам не нужно делать if, просто поместите различные предложения catch:

try {
    :
} catch (FirstExceptionType $e) {
    :
} catch (SecondExceptionType $e) {
    :
}
1 голос
/ 15 января 2012

Код, который вы используете, всегда будет неудачным, потому что вы пытаетесь использовать переменную ($this->$api($params);) в качестве функции. Как бы то ни было, вы можете реализовать свой try-catch следующим образом:

foreach ($apis as $api)
{                 
     $api = '_'.$api;
     try {
         $searchResults[$api] = $this->$api($parameters);
     }
     catch(Exception $e) {
         // handle exception
     }
}

Вы также можете обрабатывать несколько исключений разных типов, добавив еще один catch() с другим классом исключений, например:

foreach ($apis as $api)
{                 
     $api = '_'.$api;
     try {
         $searchResults[$api] = $this->$api($parameters);
     }
     catch(OtherException $e) {
         // Handle it
     }
     catch(Exception $e) {
         // Handle it
     }

}
...