【问题标题】:PHP exceptions in foreach loopforeach 循环中的 PHP 异常
【发布时间】:2012-01-15 13:15:05
【问题描述】:

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

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

如果 $this->api(); 之一返回错误消息,我想实现 php 异常,而不是捕获它并在捕获中执行 if 以显示正确的消息返回的错误信息。

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

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

所以它会再次尝试执行该功能并查看这次是否带来了有效数据?

【问题讨论】:

  • 为什么只试一次?如果您想拥有重试策略,则必须以显示您的策略的方式实施它。例如,您可以放置​​一个带有计数器的 while 循环,以确保在将原因声明为丢失之前至少重试五次。

标签: php exception try-catch


【解决方案1】:
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";
     }
}

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

【讨论】:

  • 或者使用1个catch块并使用instanceof:catch( Exception $e ) { if( $e instanceof ParameterException ) { echo 'some parameterexception was thrown'; } }
  • 我刚刚添加了这个,我会告诉你它是否有效。我需要实现它,因为有时我只是不知道为什么其中一个 api 不会返回有效的消息/连接并且需要捕获该错误并尝试再次执行该功能
  • 例如有这个异常:ApiNameLookupError,我可以抓住 Api 并执行 $searchResults['api'] = $$this->_api($parameters); ?
  • @w0rldart 我不明白你想做什么。当您想捕获 ApiNameLookupError 时,您只需替换我示例中的名称即可。每当抛出异常时,您都会立即跳入第一个可能的 catch 块。
  • 我只想过滤异常,如果从 Api1 做 $searchResults['api1'] = $$this->_api1($parameters);如果从 Api2 做 api2 功能
【解决方案2】:

由于 catch 块仅在异常情况下才会执行,因此将 for-each 循环包装在 try 块内,或者将 try-catch 放入循环体中并没有什么区别。

你应该选择任何能增加清晰度的东西。但是,如果将来需要,在循环内执行此操作将使您能够处理与循环体相关的更具体的异常。

另外,由于异常是类型化的,你不需要做if,只需放置不同的catch子句:

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

【讨论】:

  • 没问题。很高兴能帮上忙。
【解决方案3】:

您使用的代码总是会失败,因为您试图将变量 ($this->$api($params);) 用作函数。但是,您可以按如下方式实现您的 try-catch:

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

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

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

}

【讨论】:

  • 这不起作用,因为 Exception 已经处理了任何异常。不会达到第二次捕获。
猜你喜欢
  • 2011-10-19
  • 2016-09-26
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 1970-01-01
  • 2017-05-28
  • 2015-12-10
相关资源
最近更新 更多