python异常处理类源码_Flask源码异常处理问题
Flask version: 0.3
我事先在views.py里面定义了如下的异常处理方法:
@app.errorhandler(404)
def page_not_found():
return "this page is not found.", 404
@app.errorhandler(500)
def page_error():
return "this page is error.", 500
#:: 这两个异常处理方法都是错误的,因为没有加参数。
先贴几段源码
#:: 片段1
def wsgi_app(self, environ, start_response):
with self.request_context(environ):
try:
rv = self.preprocess_request()
if rv is None:
rv = self.dispatch_request()
response = self.make_response(rv)
response = self.process_response(response)
except Exception, e:
response = self.make_response(self.handle_exception(e))
return response(environ, start_response)
#:: 片段2
def dispatch_request(self):
req = _request_ctx_stack.top.request
try:
if req.routing_exception is not None:
raise req.routing_exception #:: 抛出异常
return self.view_functions[req.endpoint](**req.view_args)
except HTTPException, e:
return self.handle_http_exception(e)
#:: 片段3
class _RequestContext(object):
def __init__(self, app, environ):
self.app = app
self.url_adapter = app.url_map.bind_to_environ(environ)
self.request = app.request_class(environ)
self.session = app.open_session(self.request)
if self.session is None:
self.session = _NullSession()
self.g = _RequestGlobals()
self.flashes = None
try:
self.request.endpoint, self.request.view_args = \
self.url_adapter.match() #:: 不匹配
except HTTPException, e:
print e.code, e.description
self.request.routing_exception = e
#:: 片段4
def handle_exception(self, e):
handler = self.error_handlers.get(500)
if self.debug:
raise
self.logger.error("hello")
self.logger.exception('Exception on %s [%s]' % (
request.path,
request.method
))
if handler is None:
return InternalServerError()
return handler(e) #:: handler不为None,之前定义了500的错误处理
然后我在浏览器输入了一个不存在的路由http://localhost:5000/test,想看Flask如何异常处理。
请求过来之后会先执行片段1, 然后代码走到片段3请求上下文,片段3中self.url_adapter.match()抛出HTTPException异常被捕获。然后执行到片段2,然后抛出异常被片段1捕获到执行片段4,最后会执行到handler(e)这条语句。
我的问题来了,因为我定义的500的错误处理里面,没有加参数,导致这条语句执行失败。
报了如下错误:
Traceback (most recent call last):
File "/Users/virtualenvs/full-stack/lib/python2.7/site-packages/werkzeug/serving.py", line 180, in run_wsgi
execute(self.server.app)
File "/Users/virtualenvs/full-stack/lib/python2.7/site-packages/werkzeug/serving.py", line 168, in execute
application_iter = app(environ, start_response)
File "/Users/virtualenvs/full-stack/flask0.3/examples/flaskr/flask.py", line 1435, in __call__
return self.wsgi_app(environ, start_response)
File "/Users/virtualenvs/full-stack/lib/python2.7/site-packages/werkzeug/wsgi.py", line 591, in __call__
return self.app(environ, start_response)
File "/Users/virtualenvs/full-stack/flask0.3/examples/flaskr/flask.py", line 1382, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/Users/virtualenvs/full-stack/flask0.3/examples/flaskr/flask.py", line 1266, in handle_exception
return handler(e)
TypeError: page_error() takes no arguments (1 given)
从Traceback当中能看出最后也是这句的错误。然而浏览器还是返回了500的页面,返回的内容是Werkzeug自定义的页面内容。
Internal Server Error
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
既然程序都已经执行错误了,那为什么还能够返回HTTP Response呢?
谢谢:-)
python异常处理类源码_Flask源码异常处理问题相关推荐
- python定义类的程序_python扫码签到程序python中如何定义类
什么是类? 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下: < ...
- 如何写一个完善的c++异常处理类
我们的异常处理类的features 如何写一个异常处理类是一个不太容易的事情,最近刚好接触了一些不错的代码,看到了一些技巧,这里和大家分享一下. 一个相对完善的异常处理类(以及附加的一些东西)应该能够 ...
- or1200处理器的异常处理类指令介绍
下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...
- python底层源码_Python每天一分钟:解析python底层类的实现原理——竟然是type()
上一篇文章中,我们介绍了使用python的type()函数来动态创建用户类的详细过程,读者可以自行翻看:Python每天一分钟:类定义进阶/炫技-使用type函数动态创建类. 那么本文将进一步介绍py ...
- 教你用python制作人脸卡通画(附源码)
教你用python制作人脸卡通画(附源码) 效果展示: 让我们开始学习之路: 原理:利用第三方人脸接口将图像人脸化 第三方接口注册地址:https://ai.minivision.cn/#/login ...
- SpringBoot源码学习系列之异常处理自动配置
SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...
- 计算机毕业设计Python+djang公务员考试信息管理系统(源码+系统+mysql数据库+Lw文档)
项目介绍 随着社会的发展,近些年来的毕业生大多数会选择考研,考公员和考试教师资格证以增加自己在未来社会中的竞争能力.为了让这些有志之士能够有一个更好的学习和交流平台,我们通过计Python+djang ...
- Python concurrent.future 使用教程及源码初剖
前言 原文发在这里的 Python concurrent.future 使用教程及源码初剖 垃圾话 很久没写博客了,想了想不能再划水,于是给自己定了一个目标,写点 concurrent.future ...
- 计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档)
计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目 ...
最新文章
- 解决webApiMessageAn error has occurred./Message不能写多个Get方法的问题
- 单例模式双重校验锁_被面试官虐过之后,他轻蔑的问我:你还说你了解单例模式吗?...
- 开发自上而下的Web服务项目
- 在别人网页上运行js脚本_初始JavaScript,世界上最流行的语言之一
- 《网络管理员考试案例导学》复习重点
- hnu暑期实训之日历问题
- 【分享】请回答1988(二)
- 学linux做笔记本,linux学习之笔记本安装CentOS7
- Linux下virtualenv与virtualenvwrapper详解
- 网安信—web3.0是什么?
- hhkb java_为什么知乎上这么多人推荐 HHKB,却不反复强调说该键盘不适合大多数程序员?...
- python短信验证码_python发送短信验证码
- Cloudflare找不到服务器 IP 地址
- org.csource.common.MyException: item “tracker_server“ in null not found异常已解决
- Alpine | Docker基础镜像
- SMTP客户端python实现
- MATLAB初阶绘图
- pytorch gpu安装 torch.cuda.is_available()是true才成
- 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)
- 如何导入BurpSuite 证书