代码编写过程中,为了打造结构清晰的程序,代码层次分离的意识是很重要的。
此时就涉及到不同层异常处理的问题了,比如现在我的代码设计了三层,db操作底层,orm层,控制层,db操作层是做一些数据库增删改查操作的,这里不做异常处理,orm层会调用db层,比如insert(),这里可能会做一些异常捕获,而不关心insert内部是怎么操作的,控制层会根据对象决定调用哪个insert(例如,我们新注册了用户,需要存入数据库吧)
db层(这里不捕获异常):
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过程成功还是失败进行不同的处理):
@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,而不只是简单地处理完,就是因为控制层要根据是否有异常来选择接下来要做的事情。