本篇文章将介绍什么是异常,初学者遇见异常时发生的情况,如何捕获和处理异常,以及自定义异常;
通常的错误是指语法错误,即在编码后进行编译的时候就会发生的错误,一般高级的编译器都能自动识别语法错误;比较重要的就是异常,异常是指在程序执行期间发生的错误,比如报空异常,算术异常等待;通常我们可以使用raise抛出一个异常或者使用assert断言一个异常;
# -*- coding: utf-8 -*-
result = 5/0
当执行以上程序的时候就会出现异常(常数不能除0);出现错误信息如下,此时会造成程序停止,这是在开发中一种非常不友好的现象;我们需要的是打印出异常信息(通常是日志的方式),然后程序继续运行,并且不影响其它模块的程序运行;
Traceback (most recent call last):
File "C:/python_work/study_py_base/base/expre.py", line 3, in <module>
result = 5/0
ZeroDivisionError: division by zero
通常最简单的异常就是try/except模式进行处理,具体的说明如下
# -*- coding: utf-8 -*-
try:
result = 5/0
except ZeroDivisionError:
print("the error occur ")
print("zszxz")
以上代码执行后不会像3.1节中的程序立即停止,而是会继续运行后面的代码,打印内容如下,由此我们就解决了捕获异常,打印自定义异常信息;
the error occur
zszxz
现在异常打印的内容是自定义,如果知识追寻者想要打印原来的异常信息就需要对ZeroDivisionError 对象进行进一步的属性或者方法调用
# -*- coding: utf-8 -*-
try:
result = 5/0
except ZeroDivisionError as e:
print(e)
print("zszxz")
以上的代码执行后就会打印出原有的异常信息
division by zero
zszxz
try代码块中没有发生异常的情况
# -*- coding: utf-8 -*-
try:
result = 5/6
except ZeroDivisionError as e:
print("the error is {}".format(e))
else:
print(" normal code ")
执行结果
normal code
try代码块中发生异常的情况
# -*- coding: utf-8 -*-
try:
result = 5/0
except ZeroDivisionError as e:
print("the error is {}".format(e))
else:
print(" normal code ")
执行结果
the error is division by zero
# -*- coding: utf-8 -*-
try:
result = 5/0
except ZeroDivisionError as e:
print("the error is {}".format(e))
else:
print(" normal code ")
finally:
print(" it must be excuted")
输出结果
the error is division by zero
it must be excuted
有时候在编码过程中,出现了一些不是我们想要的结果的时候就可以抛出异常;比如我们想要获得一个参数是int类型,结果接受到的是字符串类型,这时候你就可以抛出一个异常告诉那个传字符串类型参数的家伙,这不是我要的类型的数据;
怎么抛出异常呢,很简单使用raise关键字,后面跟上异常对象即可,示例如下
# -*- coding: utf-8 -*-
param = "收下我的心意吧"
if type(param)==int:
print("这是我要的类型")
else:
raise NameError('这不是我要的类型')
此时就出现异常信息如下
Traceback (most recent call last):
File "C:/python_work/study_py_base/base/expre.py", line 8, in <module>
raise NameError('这不是我要的类型')
NameError: 这不是我要的类型
在第四节抛出异常的时候是不是感觉有点怪怪的呢,NameError 这个异常是系统自带的异常,我们是直接拿过来用了,可是跟异常信息一点都不符合对吧,应该是TypeError才对,这样异常对象就能和异常信息匹对上了;因此为了让异常显示的更加规范和友好就需要用户自定义异常,而不是使用系统那些默认的异常(如果异常信息匹配就使用系统自带的即可)
如下示例中自定义异常类需要继承Exception,然后覆盖重写__init__
方法即可,此时抛出的异常就比较规范了;
# -*- coding: utf-8 -*-
param = "收下我的心意吧"
if type(param)==int:
print("这是我要的类型")
else:
raise TypeError('这不是我要的类型')
"""自定义异常"""
class TypeError(Exception):
def __init__(self, value):
self.value = value
执行结果
Traceback (most recent call last):
File "C:/python_work/study_py_base/base/expre.py", line 8, in <module>
raise TypeError('这不是我要的类型')
TypeError: 这不是我要的类型