这是:
@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行版本吗?
答案 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')