美文网首页
php捕获异常和抛出异常

php捕获异常和抛出异常

作者: PENG先森_晓宇 | 来源:发表于2020-09-02 16:24 被阅读0次

    捕获异常的场景

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

    捕获异常和抛出异常

    • 捕获异常。将业务代码放到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
    <?php
    
    namespace App\Exceptions;
    
    use Throwable;
    
    class SumException extends \Exception
    {
        public function __construct(string $message = "", int $code = 0)
        {
            parent::__construct($message, $code);
        }
    
        public function render()
        {
            return response([
                'message' => $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{}代码中要记录错误日志,方便后续排查问题,其实抛出异常的时候就已经记录错误日志了。

    相关文章

      网友评论

          本文标题:php捕获异常和抛出异常

          本文链接:https://www.haomeiwen.com/subject/sngisktx.html