0

我是新手編程和嘗試解決錯誤處理的時刻。 但我仍然遇到同樣的問題。當我發現錯誤時,我想再次運行該腳本。問題是,如果你在第一次錯誤後輸入了一個好的輸入,它仍然認爲它是一個不好的輸入。請幫助我。錯誤處理的Python問題(嘗試,除外)

def new_user_name() 
    print "Choose a Username" 
    username = input_str() 

    try: 
     data = lite.connect(database) 
     dat = data.cursor() 
     dat.execute("INSERT INTO Users('User_Name') VALUES(?)", username); 
     dat.rollback() 
     return username 
    except: 
     print "The username %s is already in use" % username 
     time.sleep(2) 
     new_user_name() 

有人能幫我一下,或者鏈接一個關於錯誤處理的好教程嗎? 這會我幫了很多

+1

**從來沒有**使用普通'除了:'。 **總是**指定你想要捕捉的異常,在你的情況下就像'OperationalError:'除外。否則,你會沉默錯誤的錯誤,從而產生一些奇怪而難以調試的錯誤。 – Bakuriu 2013-02-24 20:36:59

回答

0

dat.rollback()(如果這是一個有效的語法,沒有檢查,但看起來接近)應該在except部分而不在try部分。

請注意,如果您啓動了函數之外的數據庫連接(因此您不必每次調用函數都需要這樣做),或者至少在try部分之外,應該更好。

+0

dat.rollback()的作品,所以我認爲它是正確的語法。我之所以這樣使用它,是因爲後來在我的代碼中,整個數據將被寫入數據庫。 (用戶名,密碼,電子郵件等)由於用戶名是唯一的,我在測試後將其刪除。但謝謝你的提示。將嘗試 – 2013-02-25 19:35:27

0
dat.execute("INSERT INTO Users('User_Name') VALUES(?)", username); 

這條線是問題所在。第二個參數應該是一個元組,而不是一個字符串,所以它引發了一個ValueError。因爲你捕獲所有的錯誤,而不是隻有sqlite3.IntegrityError(如果你嘗試插入一個重複的主鍵會引發這個錯誤),你總是會在except塊中結束。

如果可以避免,請勿使用全部爲except的塊。

+0

以外的連接感謝您的提示! – 2013-02-25 19:32:33