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

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

最佳答案

第一个实际上比第二个更糟糕。如果第二个变体引发异常,它将是特定异常,例如 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/

相关文章:

python - 继承模型元类的正确语法?

c# - 我可以使用C#在ASP.NET中创建错误日志吗?

error-handling - 常见的 lisp 重启到条件绑定(bind)

python - 使用 timeit 对不同的测试语句运行一次设置代码

python - AWS Sagemaker AttributeError : can't set attribute error

python - 使用 TKinter 在对象内部定义的图像按钮

javascript - 如何在django中的python函数处理过程中显示动画图标?

python - 尝试将一系列附加到我的数据帧时语法无效

python - 具有三个需要多对多字段的表的 Django 应用程序

error-handling - 如何从Apollo/GraphQL中捕获错误