关于 PHP 异常捕获的问题,catch 中的类应该如何选择?

我尝试在本节的以下代码中寻找异常抛出的位置

    try {
            if ($code = $request->code) {
                    $response = $driver->getAccessTokenResponse($code);    // 如果 $code 使用过的话异常会在这里抛出
                    .
                    .
                    .
            } else {
               .
               .
               .
            }
            .
            .
            .
    } catch (\Exception $e) {
        // echo $e->getMessage();  这里会显示 Undefined index: openid
        return $this->response->errorUnauthorized('参数错误,未获取用户信息');
    }

我想请教的问题是

  1. 在捕获异常的时候为什么不用 $e->getMessage()
  2. 该如何选择 catch 中的异常类,如 app/Http/Controllers/Api/VerificationCodesController.php 中 33 行到 44 行涉及到短信发送的代码
    try {
                .
                .
                .
    } catch (\GuzzleHttp\Exception\ClientException $exception) {
                .
                .
                .
    }

在网上查找资料后,按我的理解是

异常是由哪个类抛出的,在 catch 中就由哪个类捕获

结合我的理解,再去查看 overtrue/easy-sms 的源码,感觉上述问题 2 中 catch 使用 \GuzzleHttp\Exception\ClientException $exception 的原因是该扩展包使用了 GuzzleHttp 扩展包的功能,所以要使用 GuzzleHttp 中的异常处理类,不知道这样对不对

本人愚钝,还请各位赐教

I guess it comes down to a simple choice:get busy living or get busy dying.
野犭
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
liyu001989
最佳答案
  1. 可以使用 $e->getMessage() 啊,但是有的时候这些错误前端可能直接显示给用户,可以尽量更友好
  2. 基本正确,应该是:抛出的是什么异常,如果你需要对该异常做处理,就捕获什么异常。因为发送短信使用了 GuzzleHttp ,有可能抛出 GuzzleHttp 相关的异常,所以这里做相应的处理
5年前 评论
讨论数量: 5
liyu001989
  1. 可以使用 $e->getMessage() 啊,但是有的时候这些错误前端可能直接显示给用户,可以尽量更友好
  2. 基本正确,应该是:抛出的是什么异常,如果你需要对该异常做处理,就捕获什么异常。因为发送短信使用了 GuzzleHttp ,有可能抛出 GuzzleHttp 相关的异常,所以这里做相应的处理
5年前 评论
野犭

@liyu001989 那我懂了,感谢解答?

5年前 评论

@liyu001989 catch (\Exception $e),意思是不是不细分异常类型,笼统地捕获异常?

file此处的代码如果不知道具体是哪个异常,是不是也可以粗略地捕获 \Exception 呢?

5年前 评论
liyu001989

是啊

5年前 评论

你可以再记录日志的时候,使用 $e->getMessage()

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!