我是 Flask 的新手,在编写视图时,如果应该捕获所有错误,我会徘徊。如果我这样做,大多数视图代码都应该用 try... 包装。我认为这不是优雅的。
例如。
@app.route('/')
def index():
try:
API.do()
except:
abort(503)
我应该这样编码吗?如果没有,服务会崩溃(uwsgi+lnmp)吗?
你只抓住你能处理的东西。“处理”一词的意思是“做一些有用的事情”,而不仅仅是“打印一条消息然后死去”。print-and-die 已经由异常机制处理,并且可能比您做得更好。
例如,这不能有效地处理异常:
denominator = 0
try:
y = x / denominator
except ZeroDivisionError:
abort(503)
您无能为力,而且这abort
是多余的,因为这就是未捕获的异常无论如何都会导致发生的原因。这是一个有用的处理示例:
try:
config_file = open('private_config')
except IOError:
config_file = open('default_config_that_should_always_be_there')
但请注意,如果第二次打开失败,则没有任何用处,因此它将沿调用堆栈向上移动并可能停止程序。你永远不应该做的是有一个裸露的except:
,因为它隐藏了关于哪里出错的信息。当您收到“一切都是 503”的缺陷报告并且您不知道API.do()
.
无法进行任何有用处理的 Try / except 块会使代码变得混乱,并在视觉上掩盖了主要的执行流程。如果只是为了自己生成错误返回,无例外的语言会强制您检查每次调用是否有错误返回。存在异常的部分原因是为了消除代码噪音。