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

相關文章
相關標籤/搜索