foreach循环中的PHP异常


PHP exceptions in foreach loop

在foreach循环中实现php异常(try{}catch(){})的正确方法如下:

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

我想为$this->api()返回一条错误消息,然后捕获它,并在捕获中执行if以显示返回的错误消息的正确消息。

编辑:此外,当捕获错误时,如果错误消息为1(例如),这是一个好方法吗:

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

所以它尝试再次执行该函数,看看这次是否带来了有效的数据?

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";
     }
}

您也可以区分更多的异常类型。

由于catch块只有在出现异常的情况下才会执行,因此如果将for each循环封装在try块中,或者将try-catch放在循环体中,实际上没有什么区别。

你应该采取任何能增加清晰度的措施。但是,如果将来需要的话,在循环内部执行将使您能够处理与循环主体相关的更具体的异常。

此外,由于异常是键入的,您不需要执行if,只需放入不同的catch子句:

try {
    :
} catch (FirstExceptionType $e) {
    :
} catch (SecondExceptionType $e) {
    :
}

您使用的代码总是会失败,因为您试图将变量($this->$api($params);)用作函数。无论如何,你可以实现你的尝试捕获如下:

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

您还可以通过添加另一个catch()来处理不同类型的多个Exception,其中包含另一个Exception类,如:

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