我怎样才能捕获异常并继续发生错误

时间:2018-06-04 01:46:22

标签: php

我希望能够捕获异常并继续执行其他后续函数(并可能在catch部分中记录错误)。在下面的代码示例中,有些实例中$ html-> find找不到该元素并返回错误异常未定义的偏移量。在这种情况下,整个脚本都会失败。我不想专门测试此错误,而是在try部分的代码块中可能出现的任何错误。

public function parsePage1($provider)
{
  $path = $this->getFile($provider);
  $link = $this->links[$provider];
  if (file_exists($path)) {
    $string = file_get_contents($path);
    $html = \HTMLDomParser::str_get_html($string);
    $wrapper = $html->find('.classToLookFor')[0];

    unset($string);
  }

}

try {
  $this->parsePage1('nameOfProvider');
} catch(Exception $e) {
  // continue...
}

try {
  $this->parsePage2('nameOfProvider');
} catch(Exception $e) {
  // continue...
}

2 个答案:

答案 0 :(得分:1)

不,没有办法让try块中的代码继续超过异常。异常终止函数就像return一样;之后无法恢复该功能的状态。

相反,请避免首先触发错误:

$wrappers = $html->find('.classToLookFor'); # <-- no [0]!
if (count($wrappers)) {
    $wrapper = $wrappers[0];
    ...
}

答案 1 :(得分:1)

为了清楚起见,本案中的'错误'是一个通知。如果您的错误级别不包含通知(通常是生产中的情况),那么您的代码将继续超过该点。

话虽如此,通知和警告是供开发人员添加对预期输入的检查,如duskwuff的例子。

Unfortunatley,duskwuff的回答是有问题的,最新版本的PHP为7.2+。这是因为count()expects either an array or an object实现了countable

使用最新版本,您将收到警告:

Warning: count(): Parameter must be an array or an object that implements Countable in

在使用count()之前,您将回到原来的位置。一个简单的解决方法是添加对is_array的检查。

$wrappers = $html->find('.classToLookFor'); # <-- no [0]!
if (is_array($wrappers) && count($wrappers)) {
    $wrapper = $wrappers[0];
    ...
}

我还想指出,根据我的原始评论,异常捕获的整个目的是防止程序终止错误。

这不是你应该应用try-catch的错误类型的一个很好的例子,但要清楚,你的原始代码确实继续...只是不在代码的try部分,但是在catch之后( )

您对原始问题的模拟说明:

<?php

function findit($foo) {
    return $foo[0];
}

try {
    findit('');   
} catch(Exception $e) {
    var_dump($e);   
}

echo 'Hey look we continued';

输出类似于:

Notice: Uninitialized string offset: 0 in ... on line 4
Hey look we continued

我觉得这需要作为回应添加,因为将来的人们可能会发现这个问题,这与try-catch处理没什么关系,而且真的与需要工作的代码有关。有一个数组,但可能没有。