Python异常介绍 (id:3)
作者: quantgalaxy@outlook.com
blog: https://blog.csdn.net/quant_galaxy
欢迎交流
简单来说,异常就是程序出现了不正常的情况。
如果程序出现了问题或者错误,我们没有做任何处理,程序就会终止执行。
Python有两种错误很容易辨认:语法错误和异常。
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
常见的异常处理方式,是try-except:
try:
尝试执行的代码
except:
出现错误的处理
在程序执行时,可能会遇到不同类型的,并且需要针对不同类型的异常,做出不同的响应,这个时候就需要指定错误类型了:
try:
#尝试执行的代码
pass
except 错误类型1:
#针对错误类型1,对应的代码处理
pass
except(错误类型2,错误类型3):
#针对错误类型2 和3 对应的代码处理
pass
except Exception as result:
print("未知错误 %s" %result)
上面例子中,最后一个except,是对于没有指定的异常类型,做的统一处理。
finally 语句无论异常是否发生都会被执行,它常用来做清理动作,比如关闭文件描述符或者网络套接字:
try:
assert 1==1
except:
print('except!')
else:
print('else!')
finally:
# #无论是否有异常,都会执行的代码
print('finally!')
# else!
# finally!
这是python中处理异常的完整表达方式,如果except被执行,else就不会被执行;finally总是会被执行。
对于异常,我们可以打印更多的信息,比如:
try:
1 / 0
except Exception as inst:
print(type(inst)) # the exception instance
print(type(inst.args))
print(inst.args) # arguments stored in .args
print(inst)
>>>
<class 'ZeroDivisionError'>
<class 'tuple'>
('division by zero',)
division by zero
assert 1==2
# Traceback (most recent call last):
# File "/Users/lzl/Documents/repos/test/a.py", line 1, in <module>
# assert 1==2
# AssertionError
可以看到,当assert语句为False后,会抛出一个AssertionError的异常。
如果我们再断言的语句后,添加一个逗号和一个字符串,这个字符串会当成断言的提示信息,打印到异常输出中:
assert 1==2, 'this is an assertion message'
# Traceback (most recent call last):
# File "/Users/lzl/Documents/repos/test/a.py", line 1, in <module>
# assert 1==2, 'this is an assertion message'
# AssertionError: this is an assertion message
python3 -O your_script.py
通过添加 “-O” 标记,可以让python程序忽略代码里面的所有assert语句。
作者: quantgalaxy@outlook.com
blog: https://blog.csdn.net/quant_galaxy
欢迎交流
因为异常是Python对象,所以异常是有类的继承关系的。
我们可以打印出来常用异常的父类或者子类信息:
print(ZeroDivisionError.__bases__)
# (<class 'ArithmeticError'>,)
print(ArithmeticError.__bases__)
# (<class 'Exception'>,)
print(Exception.__bases__)
# (<class 'BaseException'>,)
print(BaseException.__bases__)
# (<class 'object'>,)
print(Exception.__subclasses__())
# [<class 'ArithmeticError'>,
# <class 'AssertionError'>,
# <class 'AttributeError'>,
# <class 'BufferError'>,
# <class 'EOFError'>,
# <class 'ImportError'>,
# <class 'LookupError'>,
# <class 'MemoryError'>,
# <class 'NameError'>,
# <class 'OSError'>,
# <class 'ReferenceError'>,
# <class 'RuntimeError'>,
# <class 'StopAsyncIteration'>,
# <class 'StopIteration'>,
# <class 'SyntaxError'>,
# <class 'SystemError'>,
# <class 'TypeError'>,
# <class 'ValueError'>,
# <class 'Warning'>,
# <class 'ExceptionGroup'>,
# <class 're.error'>,
# <class 'copy.Error'>,
# <class 'warnings._OptionError'>,
# <class 'tokenize.TokenError'>,
# <class 'tokenize.StopTokenizing'>,
# <class 'inspect.ClassFoundException'>,
# <class 'inspect.EndOfBlock'>]
raise语句有一个可选的from子句。此子句允许将引发的异常与作为from的参数提供的第二个异常连接起来。
注意,如果使用from子句,则它的参数必须是返回异常类或实例的表达式。
通常在except代码块中使用from将引发的异常与活动异常链接起来。
Raise exception (args) from original_exception
try:
result = 42 / 0
except Exception as error:
raise ValueError("operation not allowed") from error
'''
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError: operation not allowed
'''
作者: quantgalaxy@outlook.com
blog: https://blog.csdn.net/quant_galaxy
欢迎交流