2

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

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

库文件

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

实用程序

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

视图.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 错误异常处理很陌生。

4

1 回答 1

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 子句来处理其他另一种异常类型。请注意,这仍然可能是不够的,因为这使得(大)假设所有 OSErrors都是权限相关的。

于 2012-06-05T11:21:04.740 回答