php捕获异常和抛出异常
2020-09-02 本文已影响0人
PENG先森_晓宇
捕获异常的场景
通常使用在查询数据库,调用第三方接口,支付,队列,容易出现问题等场景下,出现问题时方便确认问题。
捕获异常和抛出异常
- 捕获异常。将业务代码放到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{}代码中要记录错误日志,方便后续排查问题,其实抛出异常的时候就已经记录错误日志了。