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源码异常处理问题相关推荐

  1. python定义类的程序_python扫码签到程序python中如何定义类

    什么是类? 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 什么是方法? 类中的函数即为方法 如何定义一个类? 定义类,语法格式如下: < ...

  2. 如何写一个完善的c++异常处理类

    我们的异常处理类的features 如何写一个异常处理类是一个不太容易的事情,最近刚好接触了一些不错的代码,看到了一些技巧,这里和大家分享一下. 一个相对完善的异常处理类(以及附加的一些东西)应该能够 ...

  3. or1200处理器的异常处理类指令介绍

    下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 我们在计算机体系结构的学习中知道:中断实质上包含由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断 ...

  4. python底层源码_Python每天一分钟:解析python底层类的实现原理——竟然是type()

    上一篇文章中,我们介绍了使用python的type()函数来动态创建用户类的详细过程,读者可以自行翻看:Python每天一分钟:类定义进阶/炫技-使用type函数动态创建类. 那么本文将进一步介绍py ...

  5. 教你用python制作人脸卡通画(附源码)

    教你用python制作人脸卡通画(附源码) 效果展示: 让我们开始学习之路: 原理:利用第三方人脸接口将图像人脸化 第三方接口注册地址:https://ai.minivision.cn/#/login ...

  6. SpringBoot源码学习系列之异常处理自动配置

    SpringBoot源码学习系列之异常处理自动配置 1.源码学习 先给个SpringBoot中的异常例子,假如访问一个错误链接,让其返回404页面 在浏览器访问: 而在其它的客户端软件,比如postm ...

  7. 计算机毕业设计Python+djang公务员考试信息管理系统(源码+系统+mysql数据库+Lw文档)

    项目介绍 随着社会的发展,近些年来的毕业生大多数会选择考研,考公员和考试教师资格证以增加自己在未来社会中的竞争能力.为了让这些有志之士能够有一个更好的学习和交流平台,我们通过计Python+djang ...

  8. Python concurrent.future 使用教程及源码初剖

    前言 原文发在这里的 Python concurrent.future 使用教程及源码初剖 垃圾话 很久没写博客了,想了想不能再划水,于是给自己定了一个目标,写点 concurrent.future ...

  9. 计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档)

    计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档) 计算机毕业设计Java计算机类在线学习管理系统(源码+系统+mysql数据库+lw文档) 本源码技术栈: 项目 ...

最新文章

  1. 解决webApiMessageAn error has occurred./Message不能写多个Get方法的问题
  2. 单例模式双重校验锁_被面试官虐过之后,他轻蔑的问我:你还说你了解单例模式吗?...
  3. 开发自上而下的Web服务项目
  4. 在别人网页上运行js脚本_初始JavaScript,世界上最流行的语言之一
  5. 《网络管理员考试案例导学》复习重点
  6. hnu暑期实训之日历问题
  7. 【分享】请回答1988(二)
  8. 学linux做笔记本,linux学习之笔记本安装CentOS7
  9. Linux下virtualenv与virtualenvwrapper详解
  10. 网安信—web3.0是什么?
  11. hhkb java_为什么知乎上这么多人推荐 HHKB,却不反复强调说该键盘不适合大多数程序员?...
  12. python短信验证码_python发送短信验证码
  13. Cloudflare找不到服务器 IP 地址
  14. org.csource.common.MyException: item “tracker_server“ in null not found异常已解决
  15. Alpine | Docker基础镜像
  16. SMTP客户端python实现
  17. MATLAB初阶绘图
  18. pytorch gpu安装 torch.cuda.is_available()是true才成
  19. 杭电计算机复试面试题库,杭电电子分院历年复试题(整理版)
  20. 如何导入BurpSuite 证书

热门文章

  1. c#中邮件收发处理(POP3,IMAP,SMTP)的实现方法
  2. 利用 .NET Framework 命令行工具
  3. Tomcat8配置tomcat-users.xml配置
  4. declare命令用法
  5. PayPal API风格指南和设计模式
  6. delphi 属性编辑器
  7. [实变函数]6 微分与不定积分
  8. Wxwinter.BPM类库更新
  9. c# 自定义文件关联程序
  10. CommunityServer研习心得(转)