代码编写过程当中,为了打造结构清晰的程序,代码层次分离的意识是很重要的。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