python异常抛出

代码编写过程当中,为了打造结构清晰的程序,代码层次分离的意识是很重要的。html

此时就涉及到不一样层异常处理的问题了,好比如今个人代码设计了三层,db操做底层,orm层,控制层,db操做层是作一些数据库增删改查操做的,这里不作异常处理,orm层会调用db层,好比insert(),这里可能会作一些异常捕获,而不关心insert内部是怎么操做的,控制层会根据对象决定调用哪一个insert(例如,咱们新注册了用户,须要存入数据库吧)python

db层(这里不捕获异常):sql

def varargsql(self, sql, *args):
    if isinstance(args, tuple):
        self.cursor.execute(sql, args)
        self.conn.commit()
    else:
        if len(args) > 0:
            self.cursor.execute(sql % args)
            self.conn.commit()
        else:
            self.cursor.execute(sql)
            self.conn.commit()

orm层(这里只是简单地输出异常信息,而后继续向上层抛出。输出异常信息是为了第一时间找到异常所在处,这里异常信息还能够更细化):数据库

def insert(self):
    try:
        sql = "insert into users (id, email, password, admin, name, image, created_at) values(%s, %s, %s, %s, %s, %s, %s)"
        dbengine.varargsql(sql, self.id, self.email, self.password, self.admin, self.name, self.image, self.created_at)
    except IntegrityError, e:
        print str(e)
        raise
    except Exception, e:
        print str(e)
        raise

控制层(这里会根据insert过程成功仍是失败进行不一样的处理):api

@app.route('/api/users', methods=['POST'])
def register_user():
    dbengine.connection(**dbconnect)
    newuser = users(id=newid, email=newemail, password=newpw, admin=0, name=newname, image="", created_at=nowdate())
    try:
        newuser.insert()
        dbengine.closeconnection()
        return render_template('register_success.html')
    except Exception:
        dbengine.closeconnection()
        return render_template('register_failed.html')

之因此orm层捕获异常以后必定要raise,而不仅是简单地处理完,就是由于控制层要根据是否有异常来选择接下来要作的事情。app

相关文章
相关标签/搜索