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{}代码中要记录错误日志,方便后续排查问题,其实抛出异常的时候就已经记录错误日志了。

你可能感兴趣的:(php捕获异常和抛出异常)