python-困惑如何;作为「;关键字在except语句中工作

python-困惑如何;作为「;关键字在except语句中工作,python,oop,Python,Oop,到目前为止,我一直试图大体上理解python中的“as”关键字是如何工作的,并学习了3个案例 案例1:将foo导入为条形图 案例2:以foo()为条: 案例3:例外情况除外,如e: 我了解前两个案例的工作原理,案例1将包名称分配给不同的名称,案例2使用类中的\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu和\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 然而,

到目前为止,我一直试图大体上理解python中的“as”关键字是如何工作的,并学习了3个案例

案例1:
将foo导入为条形图

案例2:
以foo()为条:

案例3:
例外情况除外,如e:

我了解前两个案例的工作原理,案例1将包名称分配给不同的名称,案例2使用类中的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


然而,案例3似乎有所不同,我查看了一些文件,这些文件似乎没有帮助,在任何地方都找不到太多的解释。在本例中,
Exception.args
e.args
的工作方式不同,我一直在试图弄清楚这在幕后是如何工作的,即调用任何方法,或者为什么它的行为不同

除了A作为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.

试着运行这个,这会让你明白

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

算术错误
是要捕获的Python异常类。e是该类的一个实例,在本例中,使用except语句中的子类
ZeroDivisionError

将名称与正在传递的异常关联,并使用
as
关键字

在Python3.x中,将
用作
是将异常分配给本地的唯一方法。但这不是必须的

在Python2.6+中,我们有两个选项
as
。由于
在multicatch的情况下是不明确的,这允许您在一个块中捕获多个异常<代码>as
是首选选项


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

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

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
runfile('W:/Summerizer/except.py',wdir='W:/Summerizer')
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
运行文件('W:/Summerizer/except.py',wdir='W:/Summerizer')
文件“C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第668行,在runfile中
execfile(文件名、命名空间)
文件“C:\Users\adodhiwala\AppData\Local\conda\conda\envs\py35\lib\site packages\spyder\u kernels\customize\spyderrcustomize.py”,第108行,在execfile中
exec(编译(f.read(),文件名,'exec'),命名空间)
文件“W:/Summerizer/except.py”,第10行,在
raisebaseexception()
基本例外

这里的
as
用于访问更多函数(args、message等),这样您就可以更有效地理解错误

Exception
是异常类,
e
是异常对象。
as e
基本上将名称
e
分配给已捕获的异常实例,以便您可以在
except
块中引用它(例如,用于日志记录)。请看,我明白了,这更有意义,因此,本例中的b只捕获了该类的一个对象,如果我理解的话,在本例中,您不能在未初始化的情况下自行打印LookupErrorcorrectly@NightShade对<在我的示例中,code>LookupError
是一个类对象,而
problem
是一个实例对象。第一个是类型,第二个是此类型的值。(有点。)