到目前为止,我一直在尝试大致理解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.args
与e.args
的工作方式不同,我一直在尝试弄清其在幕后的工作方式,即可以调用的任何方法,或为什么行为不同
答案 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
KeyboardInterrupt
和GeneratorExit
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
用于访问更多功能(参数,消息等),因此您可以更有效地理解错误。