所以我注意到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错误异常处理的新手。
答案 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
与权限相关。