这是:
@login_required
def remove_photo(request):
if request.is_ajax():
try:
BirdPhoto.objects.get( pk = request.POST.get('image_id') ).delete()
except Exception:
raise Exception
return HttpResponse(json.dumps({'msg':'success'}), content_type='application/json')
比这更好:
@login_required
def remove_photo(request):
if request.is_ajax():
BirdPhoto.objects.get( pk = request.POST.get('image_id') ).delete()
return HttpResponse(json.dumps({'msg':'success'}), content_type='application/json')
?我不得不承认,我并没有像我应该的那样关注错误处理和测试。所以我刚刚写了这个新函数,我想我应该确保我正在处理错误。一旦我达到了处理错误的基本水平,我看着它并对自己说:这实际上并没有做任何事情。在我看来,这两个功能将以相同的方式起作用。这是 django,所以在生产环境中服务器应该捕获它并返回一个一般的 http 响应。我可以将其保留为 4 行版本而不是 6 行版本吗?
最佳答案
第一个实际上比第二个更糟糕。如果第二个变体引发异常,它将是特定异常,例如 BirdPhoto.DoesNotExist
,并且您的日志文件或调试 View 将向您显示确切的错误是什么。第一个变体将捕获更具体的异常,并引发无用的 Exception
没有错误信息。
异常处理的第一条规则是具体的。您应该捕获您知道可能发生的特定异常,并以您想要的方式专门处理错误情况。在这种情况下,您知道 id 可能无效,并且 BirdPhoto.objects.get()
可能会引发 BirdPhoto.DoesNotExist
异常(exception)。您应该专门捕获该异常,并适本地处理它——例如通过返回状态码为 404 的响应:
@login_required
def remove_photo(request):
if request.is_ajax():
try:
BirdPhoto.objects.get(pk=request.POST.get('image_id')).delete()
except BirdPhoto.DoesNotExist:
return HttpResponse(json.dumps({'msg': 'error'}), status=404, content_type='application/json')
return HttpResponse(json.dumps({'msg':'success'}), content_type='application/json')
现在,如果代码引发了您没有预料到的异常,
500 Internal Server Error
将返回,调试 View 或日志文件将显示确切的错误消息。然后,您可以修复您的代码,或者如果预期会出现异常,则适本地处理异常。
关于python - Django中的异常处理 - 这是必要的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39331659/