在Python中,如何对类的实例化进行try(和except)?

-2 投票
1 回答
1562 浏览
提问于 2025-04-18 15:40

在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 

我肯定不是唯一一个问这个问题的人,但我担心我的搜索能力可能不太行...

更新

确实,正如评论中提到的,我在提问时似乎没注意到这一点...

我觉得让我困惑的是,github3login()方法在提供错误的用户名或密码时并没有抛出任何异常。例如:

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 个回答

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)

撰写回答