【问题标题】:PHP - Wrap a variable block in the same try-catchPHP - 在同一个 try-catch 中包装一个变量块
【发布时间】:2019-05-15 14:54:10
【问题描述】:

在我的 PHP 项目中,我使用 Guzzle 发出许多不同的 API 请求。为了处理所有异常,每个 API 调用都包装在一个 try-catch 块中。一个例子:

        try {
            $res = $client->get($url, [
                'headers' => [
                    'Authorization' => "bearer " . $jwt,
                ]
            ]);
        } catch (ClientException $clientException) {
            // Do stuff
        } catch (ConnectException $connectException) {
            // Do stuff
        }catch (RequestException $requestException){
            // Do stuff
        }

对于每一个请求,异常处理都是一样的,但是实际执行块有很大的不同,不能简单的用一组选项来描述。

有没有办法创建一个能够将自定义执行块包装到相同的 try-catch 处理中的函数/类?

我想出的唯一选择是使用一个接口,该接口带有一个由每个孩子扩展的函数 execution() 和一个函数 run(),它具有 try-catch 块并在执行块内简单地调用 $this->execution() .它会起作用,但我发现为每个不同的 API 调用创建一个全新的类太冗长了,而且只在我的项目的一个点中使用。

是否有更好/更简洁的解决方案来避免相同异常处理的代码重复?

【问题讨论】:

    标签: php error-handling code-reuse


    【解决方案1】:

    传递一个可调用对象,可以是an anonymous function, a regular function, or a class method:

    function executeGuzzle(callable $fun) {
        try {
            return $fun();
        } catch (ClientException $clientException) {
            // Do stuff
        } catch (ConnectException $connectException) {
            // Do stuff
        } catch (RequestException $requestException) {
            // Do stuff
        }
    }
    
    $res = executeGuzzle(function () use ($client) {
        return $client->get(...);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2020-04-02
      • 2011-01-24
      相关资源
      最近更新 更多