【问题标题】:How do I catch more than one exception type?如何捕获一种以上的异常类型?
【发布时间】:2016-07-08 12:13:29
【问题描述】:

我有以下代码 -

public function getPosts($limit = 25, $author = null) {

    try {

    } catch(\GuzzleHttp\Exception\ClientException $e) {
        return [];
    }

    return [];
}

当页面 404s 我得到 ClientException 时,我添加了这个 b/c,但是如果服务器返回 500 错误,我得到一个 ServerException - 我试着用 catch(Exception $ex) 替换它,但我仍然得到未处理/未捕获的异常错误。

【问题讨论】:

    标签: php exception guzzle


    【解决方案1】:

    您可以在 php 中为不同的异常类型设置多个 catch 块:

      try {
    
        } catch(\GuzzleHttp\Exception\ClientException $e) {
            return [];
        } catch(\GuzzleHttp\Exception\ServerException  $e) {
           //handle it...
     }
    

    但是,假设 Guzzle 异常扩展了一般的 php Exception 类(他们当然会这样做),将其更改为 Exception $e 应该可以工作。你确定这是抛出异常的地方吗?

    在 guzzle 站点 http://docs.guzzlephp.org/en/latest/quickstart.html#exceptions 上,您可以看到所有客户端/服务器扩展的 GuzzleHttp\Exception\TransferException 基础,因此您可以尝试捕获 GuzzleHttp\Exception\TransferException

    【讨论】:

    • 谢谢 - 我刚刚检查了其他地方,我有另一个地方正在使用 GuzzleHttp 而没有捕获异常 - 用 Exception $e 替换它就可以了。
    • @5SK5 我一般建议合理使用最细粒度的异常。
    【解决方案2】:

    只列出多个捕获:

    try {
       ...
    } catch (FooException e) {
       ...
    } catch (BarException e) {
       ...
    } catch (Exception e) {
       ...
    }
    

    【讨论】:

      【解决方案3】:

      继续追赶

      public function getPosts($limit = 25, $author = null) {
      
          try {
      
          } catch(\GuzzleHttp\Exception\ClientException $e) {
              return [];
          } catch (ServerException) {
              //some code
          }
      
          return [];
      }
      

      注意命名空间,如果你尝试捕获异常,它会捕获所有异常,如果没有,可能你没有将异常包含为使用异常或试图捕获\Exception

      【讨论】:

        【解决方案4】:

        catch 可以一个接一个地链接以处理多个错误类型。

        public function getPosts($limit = 25, $author = null) {
        
            try {
        
            } catch(\GuzzleHttp\Exception\ClientException $e) {
                return [];
            } catch(\GuzzleHttp\Exception\ServerException $e) {
                return [];
            }
        
            return [];
        }
        

        【讨论】:

        • 如果您提供更多详细信息会更好。至少在 OP 的问题中使用 Exceptions 并且不要忘记根命名空间(前导反斜杠)!
        猜你喜欢
        • 1970-01-01
        • 2012-01-16
        • 2012-10-27
        • 2014-02-14
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-25
        相关资源
        最近更新 更多