在Python中,如何对类的实例化进行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
我肯定不是唯一一个问这个问题的人,但我担心我的搜索能力可能不太行...
更新
确实,正如评论中提到的,我在提问时似乎没注意到这一点...
我觉得让我困惑的是,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 个回答
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)