-3

在 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()方法的用户名参数,以强制引发异常。

4

1 回答 1

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)
于 2014-08-01T16:15:47.497 回答