异常处理以及服务器应如何返回异常状态

本文探讨了如何在后端API设计中处理异常,建议根据业务逻辑自定义异常和HTTP状态码,如200状态码携带错误信息、4xx用于客户端错误、5xx用于服务端错误。同时,介绍了自定义业务异常、定义异常处理切面、客户端使用及HTTP额外处理的方法,强调了正确使用HTTP状态码和定制化响应对提高代码整洁性和用户体验的重要性。
摘要由CSDN通过智能技术生成

一、引子

大多数人写后端的api时,都喜欢这样定义响应:

HTTP 200 OK
...headers

{
   
  code: 500,
  msg: "error"
  data: T
}

你是不是这样写的呢?反正我刚开始做项目的时候,是这样写的,现在很多的项目也大多是这样写的。
我查了查网上的资料,一种说法是一些地区的网络运营商会劫持4xx和5xx请求,所以一律把http的状态码改成200,所有异常的状态码放在响应体中,但是现在有了https,除非中间人有那个能力搞到你的证书(有那个能力就直接在你的服务器动手脚了,还劫持你请求干啥),不然从概率学上是不可能篡改你的请求的。而且就算是不用https,也可以用自定义请求头等更优雅的办法来解决这个问题。

二、回顾HTTP状态码

先来看看HTTP状态码:
标准的http状态码有五类,分别是:

  • 1xx: 通知
  • 2xx: 成功
  • 3xx: 重定向
  • 4xx: 客户端错误
  • 5xx: 服务端错误

可以看到这些分类是很明确的,对于客户端来讲,只需要在业务代码里处理2xx,4xx就可以了,因为1xx和3xx对开发者是透明的,http调用框架(ajax、retrofit、axios等等)会自动处理;5xx是后端的锅,服务器炸掉了,和客户端开发者就更没关系了。

三、如何设计

首先,在我们的后端代码中,要自定义一个业务异常,在抛出该异常之后,异常处理切面就将响应的状态码改成4xx,其余的异常类型,http状态码都设置成5xx。因为抛出ServiceException的肯定是我们验证客户端发送来的数据出了问题,比如参数错误、权限不足等,用户改改参数就可以解决这个异常。而其他异常,比如NPE,客户端怎么改参数都是没用的,因为是服务器的代码有问题。当然你也可以将诸如HibernateValidation2.0(JSR380)的ConstraintViolation异常的http状态码也设置成4xx,看你系统具体的设计了。

3.1 自定义业务异常
@Getter
@Setter
public class ServiceException extends RuntimeException{
   
    // 该异常要返回什么样的http状态码,常用的有:
    // 400 BAD_REQUEST, 客户端的请求参数错误
    // 403 FORBIDDEN, 服务器理解请求客户端的请求,但是拒绝执行此请求,例如考试系统,用户在考试开始前请求获取试卷
    private HttpResponseCode httpCode;
    //异常的编号,一般为模块编号+异常编号
    
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值