Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
foreach循环中的PHP异常_Php_Exception_Try Catch - Fatal编程技术网

foreach循环中的PHP异常

foreach循环中的PHP异常,php,exception,try-catch,Php,Exception,Try Catch,在如下所示的foreach循环中,哪种方法是实现php异常的正确方法(请尝试{}catch(){}): foreach ($apis as $api) { $api = '_'.$api; $searchResults[$api] = $this->$api($parameters); } 我想为$this->api()中的一个实现php异常返回错误消息,然后捕获它并在捕获内执行if以显示返回的错误消息的正确消息 编辑: 此外,在捕获

在如下所示的foreach循环中,哪种方法是实现php异常的正确方法(请尝试{}catch(){}):

foreach ($apis as $api)
{                 
     $api = '_'.$api;
     $searchResults[$api] = $this->$api($parameters);
}
我想为$this->api()中的一个实现php异常返回错误消息,然后捕获它并在捕获内执行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);
)用作函数。然而,您可以按如下方式实现您的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
     }

}

或者使用1个catch块并使用:
catch(Exception$e){if($e instanceof ParameterException){echo'some ParameterException被抛出';}}}
我刚刚添加了这个,我会让你知道它是否有效。我需要实现它,因为有时我只是不知道为什么其中一个Api不会返回有效的消息/连接,需要捕获该错误并尝试再次执行该函数。例如,有这样一个异常:ApiNameLookupError,我可以抓取Api并执行$searchResults['Api']=$$this->\U Api($parameters)@我不明白你想做什么。当您想要捕获ApiNameLookupError时,只需替换我的示例中的名称。每当抛出异常时,您都会立即跳入第一个可能的catch块。如果从Api1执行$searchResults['Api1']=$$this->\u Api1($parameters),我只想过滤异常;如果从Api2执行Api2功能,为什么只尝试一次?如果您想拥有重试策略,则必须以显示策略的方式实现它。例如,您可以放置一个带有计数器的while循环,该计数器将确保在将原因声明为丢失之前至少重试五次。这将不起作用,因为异常将已经处理任何异常。第二次抓不到,没问题。很高兴能帮上忙。