【问题标题】:Python problems with error handling (try, except)错误处理的 Python 问题(尝试,除外)
【发布时间】:2013-02-09 23:02:42
【问题描述】:

我是编程新手,目前正在尝试解决错误处理。 但我一直遇到同样的问题。当我发现错误时,我想再次重新运行脚本。问题是,如果你在第一个错误之后输入了一个好的输入,它仍然认为它是一个错误的输入。请帮帮我。

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()

谁能帮助我,或者链接一个关于错误处理的好教程? 对我有很大帮助

【问题讨论】:

  • 从不使用普通的except:始终 指定您想要捕获的异常,在您的情况下类似于except OperationalError:。否则,您将忽略错误的错误,从而产生一些奇怪且难以调试的错误。

标签: python exception exception-handling error-handling try-catch


【解决方案1】:

dat.rollback()(如果这是一个有效的语法,没有检查但看起来很接近)应该在 except 部分而不是在 try 部分。

请注意,最好在函数外部初始化数据库连接(这样您就不必每次函数调用都这样做)或至少在 try 部分之外。

【讨论】:

  • dat.rollback() 有效,所以我认为它是正确的语法。我这样使用它的原因是因为稍后在我的代码中,整个数据将被写入数据库。 (用户名、密码、电子邮件等)由于用户名是唯一的,因此我在测试后将其删除。但谢谢你的提示。将在尝试之外获得我的连接
【解决方案2】:
dat.execute("INSERT INTO Users('User_Name') VALUES(?)", username);

这一行是问题所在。第二个参数应该是一个元组,而不是一个字符串,所以它产生了一个ValueError。因为您要捕获所有错误,而不仅仅是 sqlite3.IntegrityError(如果您尝试插入重复的主键会引发此错误),您将始终处于 except 块中。

如果可以避免,切勿使用包罗万象的except 块。

【讨论】:

    【解决方案3】:

    Python 有一个很棒的官方文档,链接如下:

    v 2.7 http://docs.python.org/2/tutorial/errors.html v 3.3 http://docs.python.org/3.3/tutorial/errors.html

    请注意,您绝不能在没有 Exception 类的情况下使用 except:,这是一种不好的做法。

    【讨论】:

      猜你喜欢
      • 2014-05-24
      • 2021-05-17
      • 1970-01-01
      • 1970-01-01
      • 2019-12-09
      • 1970-01-01
      • 2017-10-13
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多