在我的Pylons应用程序中,我希望能够在代码中的任何地方抛出异常,并在中心点拦截非致命的异常,以便我可以返回“友好”错误页面,例如“抱歉,我不能这样做“
致命的异常应该转到默认的错误处理程序,它通过电子邮件向我发送错误报告并向用户返回标准的“内部服务器错误”。
现在我在BaseController.__call__
中使用这样的东西:
try:
return WSGIController.__call__(self, environ, start_response)
except Exception, exc:
if self.is_nonfatal_exception(exc):
start_response("200 OK", [("Content-type", "text/plain")])
return ["Sorry!"]
raise
但这是推荐的方法吗?
答案 0 :(得分:3)
是的,这看起来不错。
另请查看pylons.controllers.utils.abort()。您可以在控制器代码中的任何位置执行abort(some_http_code[, message])
。与此一起使用的典型HTTP代码是404(“找不到页面”,客户端正在查找不存在的内容),403(“禁止”,不允许用户访问该页面/资源),400(“不好”请求“,请求参数验证失败”等。此函数也可以通过抛出特殊异常,然后捕获它们并从中间件堆栈返回标准错误页面来工作。
当然,您也可以从模型和其他地方调用abort()
,而不仅仅是控制器。但这将是糟糕的风格,混合控制器逻辑与模型逻辑,跳跃抽象水平。
最后,对于您希望常见的错误情况,请考虑不使用异常,而是使用函数的返回代码。长期冒泡的例外可能会破坏封装(远程组件需要了解彼此的异常,以及如何处理这些异常)。