在Python中,如何尝试(和除外)类的实例化?

时间:2014-08-01 16:12:10

标签: python oop try-except

在Python中,一个try / except如何实例化一个类?

例如,我现在正在处理GitHub脚本:

from github3 import login
user = login(username, password)

起初,我认为它会像以下一样简单:

try:
    user = login(username, password)
except Exception, e:
    print e

但是如果我强制例外(例如提供错误的参数),那么我就不会看到任何例外:

$ python my-script.py -u 1 -p 1; echo $?
name 'pw' is not defined
0

如果我再试一次,但将try / except从混合中取出,我会得到我希望看到的例外情况:

$ python my-script.py -u username -p password; echo $?
Traceback (most recent call last):
  File "delete-all-gists.py", line 19, in <module>
    user = login(u, pw)
NameError: name 'pw' is not defined
1 

我无法成为唯一一个提出这个问题的人,但我担心我的SO-search-fu可能会让我失望......

更新

事实上,正如评论中所提到的那样,在问这个问题时我似乎已经闭上眼睛了......

我认为让我失误的是,如果提供了错误的用户名/密码,github3 login()方法并没有抛出任何异常。例如:

from github3 import login
u = 'foo'
p = 'bar'

try:
    user = login(u, p)
except Exception, e:
    print e

返回:

无。没有错误,例外或任何事情。

但是,以下确实会引发异常,如预期的那样:

from github3 import login
u = 'foo'
p = 'bar'

try:
    user = login(username, p)
except Exception, e:
    print e

返回:

name 'username' is not defined

当然,这是因为我特意提供了一个不存在的变量作为login()方法的用户名参数来强制引发异常。

1 个答案:

答案 0 :(得分:3)

请记住,每次运行try/except块时都应该这样,因为您可以合理地处理发生的异常。例如:

username, password = input("Username: "), input("Password: ")
while True:
    try:
        login(username, password)
    except BadPasswordException as e:
        print("Invalid login")
    else:
        # you only get here if there are no exceptions
        break

如果您无法合理地处理异常,最好记录它并让程序正常退出。

try:
    foo(some,arguments)
except CthuluHasBeenReleasedException as e:
    logging.fatal("Oh (old) god!")
    sys.exit(1)