【问题标题】:Can try catch be used this way to handle exceptions?可以用这种方式使用try catch来处理异常吗?
【发布时间】:2016-05-04 21:22:49
【问题描述】:

Try catch是用来处理异常的,但也可以这样用吗?

private $blockUrl = [];   

public function doSomething($urls) {
    try {
        foreach ($urls as $key => $url) {
            if (in_array($url, $this->blockUrl)) continue;
            $meta[$url] = get_meta_tags($url);
            unset($urls[$key]);
        }
    } catch (Exception $e) {
        $this->blockUrl[] = $url;
        return $this->doSomething($urls);
    }

    return $meta;
}

所以基本上它的作用是获取传递给方法的 url 的元标记。然后如果get_meta_tags 发生异常,则会抛出异常,并且导致异常的url 将被放入数组$this->blockUrl。然后它会再次调用相同的方法,但这一次,只会再次验证剩余的 url。

这是执行此逻辑的正确有效方法吗?

我在这里使用了try catch,因为有时我在get_meta_tags 上收到curl 错误,我只想跳过那些有这些错误的网址并继续流程。

【问题讨论】:

  • curl 是否真的会抛出 exception...?!或者只是显示错误/通知?后者不能是caught
  • @deceze - 在 PHP 7 中,您可以将其捕获为 Throwable
  • 是的,它有效,我想知道这是否是一种好的做法,或者是否有更好的方法来处理这个问题。
  • 将 try/catch 放入 foreach 循环中,然后将 continue 放入 catch 中怎么样?

标签: php laravel exception exception-handling try-catch


【解决方案1】:

正如我在评论中所建议的,您可以在循环内进行错误检查,然后跳过任何不好的错误。这允许您摆脱 $blockUrl 数组,除非您在其他地方需要它。

public function doSomething($urls) {
    $meta = array();
    foreach ($urls as $key => $url) {
        try {
            $result = get_meta_tags($url);
            $meta[$url] = $result;
        } catch (Exception $e) {
            continue;
        }
    }
    return $meta;
}

【讨论】:

    【解决方案2】:

    try/catch 放入循环中:

    public function doSomething($urls) {
        $meta = [];
    
        foreach ($urls as $url) {
            try {
                $meta[$url] = get_meta_tags($url);
            } catch (Exception $e) {
                //
            }
        }
    
        return $meta;
    }
    

    别忘了初始化$meta数组,否则当你尝试返回一个未定义的变量时可能会出错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-01
      • 2017-03-04
      • 1970-01-01
      • 2018-06-24
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多