Skip to main content

代码优化-统一管理错误信息

在本节中,我们将通过统一管理错误信息的方式来优化代码,并且将错误码和错误信息存储在一个单独的文件中。这样做的好处在于可以减少魔鬼数字的出现,并且方便维护和更新错误信息。

错误管理

首先,我们需要在dx_movie下新建一个utils文件夹,然后在utils下创建一个error.py文件来统一管理错误信息。在该文件中,我们可以定义不同类别的错误,并为每种错误定义一个错误码和错误信息。

例如,我们可以定义一个MovieError类,用于存储与电影相关的错误信息。我们可以为每个错误定义一个类属性,其中包括错误码和错误信息。这样,我们就能够通过MovieError.MovieNotFound访问电影未找到的错误信息。

以下是一个示例:

dx_movie/utils/error.py
class MovieError():
MovieNotFound = (10001, '电影信息不存在')
# 其他电影相关的错误信息...

class UserError():
UserNotFound = (20001, '用户信息不存在')
CollectMovieFailed = (20002, '收藏电影失败')
CancelMovieFailed = (20003, '取消电影失败')
NotCollectMovie = (20004, '未收藏该电影')
# 其他用户相关的错误信息...

统一返回格式

为了统一返回格式,我们可以创建一个response_data函数,用于将错误信息转化为字典格式。该函数接收 status_codemessagedata等参数,并返回一个字典。

以下是一个示例:

dx_movie/utils/error.py
def response_data(status_code=0, message=None, data={}, **kwargs):
return dict({
'status_code': status_code,
'message': message,
'data': data
}, **kwargs)

使用response_data函数,我们可以将错误信息以字典的形式返回给前端。例如,我们可以使用response_data函数来返回MovieError.MovieNotFound错误:

return ResponseData(*MovieError.MovieNotFound)

这样,我们就将错误信息转化为了以下字典形式:

{
'status_code': 10001,
'message': '电影信息不存在',
'data': {}
}

使用错误管理

在代码中,我们只需要引入error.py文件,并使用相应的错误类和错误码即可。通过使用错误管理,我们可以更好地组织错误信息,并且当需要修改错误信息时,我们只需要在error.py文件中更新,而无需修改其他代码。

例如,在account/views.py文件中,我们将原来的return Response进行修改,示例代码如下所示:

dx_movie/account/views.py
from utils.error import UserError, MovieError, response_data

class CollectViewSet(viewsets.ModelViewSet):

def create(self, request):
user = request.user
profile = Profile.objects.get(user=user)
movie_id = request.data['movie_id']
try:
movie = Movie.objects.get(id=movie_id)
profile.movies.add(movie)
return Response({
'status_code': 0,
'message': '收藏成功'
})
except ObjectDoesNotExist:
# return Response({
# 'status_code': 10001,
# 'message': '电影信息不存在'
# })
return Response(response_data(*MovieError.MovieNotFound))
except:
return Response(response_data(*UserError.CollectMovieFailed))

def destroy(self, request, pk):
user = request.user
profile = Profile.objects.get(user=user)
try:
movie = Movie.objects.get(id=pk)
if movie not in profile.movies.all():
return Response(response_data(*UserError.NotCollectMovie))
profile.movies.remove(movie)
return Response({'status_code':0,
'message': '取消收藏成功'})
except ObjectDoesNotExist:
return Response(response_data(*MovieError.MovieNotFound))
except:
return Response(response_data(*UserError.CancelMovieFailed))

原来代码中包含错误信息的,小伙伴都可以通过这种方式来处理。

总结

本节中,我们通过统一管理错误信息的方式来优化了代码。将错误码和错误信息存储在一个单独的文件中,可以方便维护和更新错误信息,并且可以减少错误码的出现。同时,我们通过使用ResponseData函数,可以统一返回格式,并且将错误信息转化为字典形式。这样做不仅提高了代码的可读性,还能更好地组织和管理错误信息。

我们在项目开发过程中可以根据实际需求来定义错误类和错误码,并根据返回的状态码来显示正确的错误信息。这种统一的错误管理方式能够提高代码的可维护性和可扩展性,使我们的项目更加健壮和稳定。