对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的。

    try:

      code block

    except A:

      except A handle

    except:

      other except

    else:

      if no exception, excute here

    finally:

      code

    对于try....except捕捉异常,如果在try中发生了异常,会在except中捕捉到,并处理。如果没有发生异常,会执行else语句

    但是不论异常是否发生,都会执行finally语句,所以我们一般会在finally语句中释放资源。

但是,如果所有的代码中我们都加上各种异常捕获,会显得代码比较啰嗦,其实我们是可以将异常处理的逻辑提取出来,统一处理的。

1)下面我们先自定义已知异常处理,继承自werkzeug.exceptions下面的HTTPException

  from flask import request, json

  from werkzeug.exceptions import HTTPException

  def APIException(HTTPException):

    code = 500

    msg = "sorry, we made a mistake"

    error_code = 500

    def __init__(msg=None, code=None, error_code=None):

      if code:

        self.code=code

      if msg:

        self.msg=msg

      if error_code:

        self.error_code = error_code

      super(APIException, self).__init__(self.msg, None)

    # 根据restful的特性,需要不论输入还是输出都需要是json格式,所以我们这里重写get_body方法,将返回值定义为json格式

    def get_body(self, environ):

      resp = dict(

        msg = self.msg,

        error_code = self.error_code,

        request = request.method + " "+ self.get_url_without_param() # 告诉前端,是哪个接口除了问题

      )

      return json.dumps(resp)

    # 重写get_header方法,告诉浏览器返回的是json格式,按照json格式解析

    def get_header():

      return [("content-type","application/json")]

    @staticmethod

    def get_url_without_param():

      full_url = str(request.full_path)

      main_url = full_url.split("?")

      return main_url[0]

  要使用我们的APIException也是很简单的,如要处理参数异常,我们可以定义一个ParamError的类,继承自APIException

    class ParamError(APIException):

      code =400

      msg = "invalid parameters"

      error_code = 1000 # 自定义

   然后在捕获到参数异常的时候,直接抛出我们自定义的ParamError()即可

  如果是前端传递过来的参数验证出异常的话,要使用我们的ParamException,需要手动的抛出异常,但是默认的wtforms会将错误信息放到errors中,而不会抛出异常,所以我们还需要重写wtforms的验证方法

    from wtforms import Form

    class BaseForm(Form):

      def __init__(self, data):

        # 调用父类的init方法

        super(BaseForm, self).__init__(data = data)

      def validate_for_api(self,):

        # 调用父类的验证方法,如果验证有问题,主动抛出ParamError异常 并将errors作为msg参数传递过去

        valid = super(BaseForm, self).validate()

        if not valid:

          # 这里的self 就是我们常规说的验证的form

          raise ParamError(msg = self.errors)

        return self

  后面所有form直接继承此BaseForm即可,然后在要验证参数的地方调用重写的validate_for_api即可。

2)我们定义个全局函数去统一处理所有的异常

  from werkzeug.exceptions import HTTPException

  # 使用装饰器去捕捉异常 

  @app.errorhandler(Exception)

  def errorHandler(e):

    if isinstance(e, APIException):

      # 已知异常

      return e

    if isinstance(e, HTTPException):

      # HTTP异常

      code = e.code

      msg = e.description

      error_code = 1007 # 自定义

      return APIException(msg, code, error_code)

    else:

      # 其他未知异常,此处需要分是生产环境还是开发环境,如果是生产环境,返回json格式的异常,如果是开发环境,我们需要详细的异常说明去分析异常原因

      if not app.config["DEBUG"]:

        return ServerError()  # 类似于上面定义的ParamError,自定义ServerError的code和msg

      else:

        raise e

这样全局异常就处理完成,不论是发生何种异常,我们都能捕捉到并进行处理了。

      

    

flask异常处理的更多相关文章

  1. flask异常处理:abort、errorhandler、app_errorhandler,封装全局异常处理

    目录 1. abort() 1.1 使用方式一:传递一个错误码 1.2 使用方式二:传递一个json格式字符串 1.3 使用方式三:传递一个响应体 2. errorhandler 2.1 简单使用: ...

  2. 【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理

    在view函数中,如果需要中断request,可以使用abort(500)或者直接raise exception.当然我们还需要返回一个出错信息给前端,所以需要定制一下ErrorHandler.一般只 ...

  3. flask模板,路由,消息提示,异常处理

    1.flask的路由与反向路由 from flask import Flask, request, url_for app = Flask(__name__) @app.route('/') def ...

  4. Flask开发技巧之异常处理

    Flask开发技巧之异常处理 目录 Flask开发技巧之异常处理 1.Flask内置异常处理 2.HTTPException类分析 3.自定义异常处理类 4.方便的定义自己的错误类 5.注意事项 本人 ...

  5. Flask的socket.error:10053

    一脸懵逼: 学习python一段时间,最近使用flask搭建了一个服务器,然后使用phantom(相当于浏览器)发送请求发送了几条flask就挂掉了,报错信息如下: 由于个人python经验不是很足, ...

  6. flask 添加日志

    def add_error_handler(app): for exception in default_exceptions: app.register_error_handler(exceptio ...

  7. Inside Flask - app.py - 1

    Inside Flask - app.py - 1 除 werkzeug 和 jinja2 等依赖库外,app.py 是在 Flask 的 __init__.py 中导入的第一个 Flask 自身的模 ...

  8. Python之Flask Web开发

    下载python包管理工具Pip: 访问网址:https://pip.pypa.io/en/stable/installing/    下载文件get-pip.py到本地计算机 定位到get-pip. ...

  9. Flask中全局变量的实现

    我们都知道在Flask中g,request,session和request是作为全局对象来提供信息的,既然是全局的又如何保持线程安全呢,接下来我们就看看flask是如何做到这点的.在源码中的ctx.p ...

随机推荐

  1. win10 出现0x80072efd错误

    0x80072efd 0x80072efd 是网络问题,windows更新或windows应用商店出现0x80072efd问题,请检查本机代理,是否开着小飞机(Shadowsocks)之类的代理工具. ...

  2. int,int32_t,int64_t

    一.数据类型特别是int相关的类型在不同位数机器的平台下长度不同.C99标准并不规定具体数据类型的长度大小,只规定级别.作下比较: 16位平台 char         1个字节8位short     ...

  3. Unity Editor 下创建Lua和Text文件

    预览 在Project视图中,扩展右键菜单,右键 – Create - Text File 创建一个Text文件,或者Lua文件. 关键点 获取当前选择的路径,以Assets路径开头 var sele ...

  4. IPerf——网络测试工具介绍与源码解析(4)

    上篇随笔讲到了TCP模式下的客户端,接下来会讲一下TCP模式普通场景下的服务端,说普通场景则是暂时不考虑双向测试的可能,毕竟了解一项东西还是先从简单的情况下入手会快些. 对于服务端,并不是我们认为的直 ...

  5. C语言经典例题(菜鸟教程100例)

    学习c语言基础,怎么能少了菜鸟教程上的100道例题呢,这里整理一下每道题的链接,希望大家能享受学习的乐趣 1,有1,2,3,4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 2,企业发放 ...

  6. ASP.NET -- WebForm -- ViewState

    ASP.NET -- WebForm --  ViewState 1. ViewState的作用 当 ASP .NET 中的表单被提交时,表单会随所有表单值一同重新出现.这是由于 ASP .NET 维 ...

  7. 适合使用并行的一种bfs

    这种写法的bfs和前面的最大区别在于它对队列的处理,之前的简单bfs是每次从队列中取出当前的访问节点后,之后就将它的邻接节点加入到队列中,这样明显不利于并行化, 为此,这里使用了两个队列,第一个队列上 ...

  8. 【2018.05.09 Python学习及实践】个人项目中使用的Python库备忘-持续更新

    科研中无论是使用C/C++.Python.Matlab,如果能找到合适的库可谓是事半功倍: 有时候忙活半天才发现本身就有成熟的库可用,自己实现的在功能.性能.安全性上都远远不及,虽然锻炼了能力,但存在 ...

  9. Java strictfp

    strictfp关键字 用于强制Java中的浮点计算(float或double)的精度符合IEEE 754标准. 不使用strictfp:浮点精度取决于目标平台的硬件,即CPU的浮点处理能力. 使用s ...

  10. 寒假特训——搜索——H - Nephren gives a riddle

    What are you doing at the end of the world? Are you busy? Will you save us? Nephren is playing a gam ...