【问题标题】:In Python, how does one try (and except) the instantiation of a class?在 Python 中,如何尝试(并且除外)类的实例化?
【发布时间】:2014-08-01 16:12:09
【问题描述】:

在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 可能会让我失望......

更新

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

我认为,如果提供了错误的用户名/密码,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() 方法的用户名参数来强制引发异常。

【问题讨论】:

  • 您正在捕获所有异常,您希望发生什么?
  • 错误信息 ('name 'pw' is not defined') 被打印出来了,你还期待什么?!
  • 是的,你发现了它print e = name 'pw' is not defined
  • 是的,看来我已经发出了嘘声。谢谢。
  • 您更新的问题似乎更多地是关于 GitHub 的模块而不是您的标题。你怎么知道它没有抛出异常?当您提供无效凭据时,user 会发生什么?您应该对此进行测试。

标签: python oop try-except


【解决方案1】:

请记住,任何时候运行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)

【讨论】:

  • 是的,您的回答是正确的,但它没有回答我的问题,即如何专门try/catch 类的实例化。您的回答基本上告诉我“如果您无法处理异常,请记录并退出”。我承认我的问题有缺陷,这个答案没有回答问题,IMO。
  • @MasterRoot24 您已经知道如何捕获通过实例化类引发的异常,因为您在示例中已经这样做了。你不知道什么时候应该这样做。我回答了你想问的问题,因为你的问题回答了你问的问题。
  • 我的问题是专门关于将变量分配给 try/except 块内的类 (user = login()) 的实例,以便允许在该对象上调用方法,例如:email = user.email()。考虑到这一点,在您的答案中给出的示例中,我将如何使用 login() 方法返回的 User 对象?
  • @MasterRoot24 所以你的问题不是关于try/except,而是关于使用一个类的实例?我很困惑....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2014-06-18
  • 2018-07-04
相关资源
最近更新 更多