php捕获异常和抛出异常

捕获异常的场景

通常使用在查询数据库,调用第三方接口,支付,队列,容易出现问题等场景下,出现问题时方便确认问题。

捕获异常和抛出异常

  • 捕获异常。将业务代码放到try{}代码块中,将捕获这段业务代码中的异常。
try {
     //业务代码
  } catch (Exception $exception) {
     
  }
  • 抛出异常。当try{}代码块中的业务代码出现异常时,我们在catch{}代码中throw new Exception($exception->getMessage())来抛出异常。
try {
     //业务代码
  } catch (Exception $exception) {
     throw new Exception($exception->getMessage());
  }

当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 “catch” 代码块。如果捕获异常了,但未抛出异常,此时代码会继续执行,继续执行的话业务逻辑肯定出错。

需要注意的:捕获异常和抛出异常永远是一对的,互相存在的。

我们举个例子,不抛出异常的代码如下:

        $a = '1a';
        $b = '2';
        $sum=0;
        try {
            $sum = $a + $b;
        } catch (Exception $exception) {
            Log::info('sum为:' . $exception->getMessage());
//            throw new Exception($exception->getMessage());
        }
        return $sum;

返回结果是0,可以看出变量a并不是int型的。由于捕获到异常但并没有抛出异常,所以继续执行了return $sum,返回了0,但我们想要的结果肯定不是0啊此时就需要抛出异常,代码如下:

        $a = '1a';
        $b = '2';
        $sum=0;
        try {
            $sum = $a + $b;
        } catch (Exception $exception) {
            Log::info('sum为:' . $exception->getMessage());
            throw new Exception($exception->getMessage());
        }
        return $sum;

返回结果httpCode为500,返回错误信息为A non well formed numeric value encountered。

APP_DUBUG环境变量

我们知道代码抛出异常了之后,返回的500状态码和错误信息,在生产环境中,我们并不希望这些错误信息暴露给用户,在laravel中的环境变量中有一个为APP_DUBUG,值为false时,表示错误信息不展示给用户。接口报500时,返回如下信息

image.png

自定义异常类

我们知道抛出异常后,会报500的错误,返回给前端用户不是很友好。如果我们想把异常转换为将被发送回浏览器的 HTTP 响应,该怎么办?我们可以自己实现异常类。

  • 创建一个异常类,SumException.class
 $this->message,
            'code' => $this->code,
        ], 406);
    }
}
  • 在代码中调用SumException
       $a = '1';
        $b = '2a';
        $sum=0;
        try {
            $sum = $a + $b;
        } catch (Exception $exception) {
            Log::info('sum为:' . $exception->getMessage());
            throw new SumException($exception->getMessage(),406);
        }
        return $sum;

返回结果为

image.png

调用自己的异常类时,不管环境变量APP_DUBUG的值为true或false时,都会返回异常信息。

规范写法

 try {
     //业务代码
  } catch (Exception $exception) {
      Log::info('error',['message'=>$exception->getMessage()]);
      throw new Exception($exception->getMessage());
  }
           

我们必须要在catch{}中抛出异常,如果不抛出异常,代码会继续执行。其次是我们我们在catch{}代码中要记录错误日志,方便后续排查问题,其实抛出异常的时候就已经记录错误日志了。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=12730,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?