Python-混淆“ as”关键字在except语句中的工作方式

时间:2019-02-13 09:22:38

标签: python oop

到目前为止,我一直在尝试大致理解python中的“ as”关键字如何工作,并为此学习了3种情况

情况1:import foo as bar

情况2:with foo() as bar:

情况3:except Exception as e:

我了解前两种情况的工作原理,情况1的工作原理是将包名称分配给其他名称,案例2的工作原理是使用类中的__entry____exit__方法(例如,确保资源关闭) ,其中__entry__返回分配给类别bar的类。

但是,情况3似乎有所不同,我正在查看文档,这些文档似乎无济于事,在任何地方都找不到太多的解释。在这种情况下,Exception.argse.args的工作方式不同,我一直在尝试弄清其在幕后的工作方式,即可以调用的任何方法,或为什么行为不同

4 个答案:

答案 0 :(得分:2)

短语except A as b:指出,在以上try子句中,将捕获类A(或其子类)的所有异常。然后,实际捕获的异常将在变量b中可见。

try:
  raise KeyError('example')
except LookupError as problem:
  print("I caught %r as problem." % problem)

这将打印

I caught KeyError('example',) as problem.

答案 1 :(得分:2)

在用于将名称与要传递的异常相关联的except语句中,使用as关键字。

使用as是在Python 3.x中将异常分配给本地变量的唯一方法。但这不是必需的。

在Python 2.6+中,我们有2个选项,as。因为,在多重捕获的情况下是模棱两可的,它允许您在一个例外块中捕获多个异常。 as是首选。

在Python 2.5及更早版本中,我们使用,进行关联,因为不支持as

答案 2 :(得分:0)

尝试运行此命令,这应该很清楚。

try:
    zero = 0
    b = 1.0 / zero
except ArithmeticError as e:
    print( "Runtime error: ", e)

ArithmeticError是要捕获的Python异常类。 e是该类的实例,在本例中为子类ZeroDivisionError

答案 3 :(得分:0)

调用e.args意味着您可以访问异常对象的属性。但是它不会捕获BaseException SystemExit KeyboardInterruptGeneratorExit

try:
    i = 1/0
    print(i)
except Exception as e:
    print (e.args)

这将打印:

('division by zero')

如果我们遇到BaseException错误

try:
    raise BaseException()
except Exception as e:
    print (e.args)

输出将是这样

runfile('W:/Summerizer/except.py', wdir='W:/Summerizer')
Traceback (most recent call last):

  File "<ipython-input-3-11e8f07e28c7>", line 1, in <module>
    runfile('W:/Summerizer/except.py', wdir='W:/Summerizer')

  File "C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 668, in runfile
    execfile(filename, namespace)

  File "C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 108, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "W:/Summerizer/except.py", line 10, in <module>
    raise BaseException()

BaseException

此处as用于访问更多功能(参数,消息等),因此您可以更有效地理解错误。