捕获异常并将它们输出到django的消息系统

时间:2012-06-05 04:32:30

标签: python django exception-handling

所以我注意到Django有一个很好的消息框架。它有5个不同的级别(信息,错误,调试,警告和成功)。

将异常一直传播到视图级别并报告其中一些异常会非常好。

lib.py

def read_file(user, filename, **kwargs):
   try:
     with open(...):
        return f.read()
   except Exception, e:
     raise e

utli.py

def wrapper_read_file(user, filename, **kwargs):
   try:
      if user.is_authenticated and user.belongs('admin'):
          lib.read_file(...)
      else:
          raise Exception("Unauthenticated user!!!")
   except Exception, e:
      raise e

views.py

def my_view(request):
   [..] do something here
   try:
     result = wrapper_read_file(...)
     return render(request, 'hello.html', {'result': result})
   except Exception, e:
     if isinstance(e, IOError):
         if e.errno==errno.ENOENT:
         messages.add_message(request, message.ERROR, 'File does not exist.')
     elif isinstance(e, OSError):
         messages.add_message(request, message.ERROR, 'You don't have sufficient permission to open the file.')
     return render(request, 'hello.html', {'hello_world': 'hello_world'}

Django知道如何渲染messages,我有能力做到这一点。因此它会显示messages

您认为我的异常处理看起来合理吗?还有其他建议吗?我是Python错误异常处理的新手。

1 个答案:

答案 0 :(得分:2)

您可能不希望捕获每个异常。这可能会掩盖其他错误,并会阻止Ctrl-C工作。相反,只捕获您想要处理的异常。

try:
    # action that may throw an exception
except IOError, e: # Will only catch IOErrors
    if e.errno == errno.ENOENT:
        messages.add_message(request, messages.ERROR, "File not found")
    else:
        raise e    # Re-raise other IOErrors
except OSError, e: # Will only catch OSErrors
    messages.add_message(request, messages.ERROR, "Insufficient permissions")

return render(request, 'hello.html', {})

更新:添加了第二个except子句来处理其他异常类型。请注意,这仍然可能不够,因为这会使(大)假设 all OSErrors与权限相关。