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