Django中的异常处理 - 这是必要的吗?

时间:2016-09-05 13:27:07

标签: python django error-handling

这是:

@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行版本吗?

2 个答案:

答案 0 :(得分:4)

第一个实际上更糟而不是第二个。如果第二个变量引发异常,则它将是一个特定的异常,例如BirdPhoto.DoesNotExist,您的日志文件或调试视图将显示确切的错误。第一个变体将捕获更具体的异常,并引发无用的Exception而没有错误消息。

异常处理的第一条规则是具体。您应该捕获您知道可能发生的特定异常,并特别按您希望的方式处理错误情况。在这种情况下,您知道ID可能无效,BirdPhoto.objects.get()可能会引发BirdPhoto.DoesNotExist异常。您应该特别捕获该异常,并适当地处理它 - 例如通过返回状态代码为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,并且调试视图或日志文件将显示确切的错误消息。然后,您可以修复代码,或者如果预期异常,则适当地处理异常。

答案 1 :(得分:2)

首先,是否有理由不使用DeleteView

如果是这样,似乎使用get_object_or_404是最合适的解决方案:

@login_required
def remove_photo(request):
    if request.is_ajax():
        get_object_or_404(BirdPhoto, pk=request.POST.get('image_id')).delete()
        return HttpResponse(json.dumps({'msg':'success'}), content_type='application/json')