代碼編寫過程當中,爲了打造結構清晰的程序,代碼層次分離的意識是很重要的。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