一. 异常机制本质
- 在没有异常机制时,需要考虑各种异常情况,导致逻辑代码和错误处理代码放在一起,而且要求程序员考虑很多例外情况。
- 异常是指程序运行过程中出现的非正常现象,例如用户输入错误,除数为零,需要处理的文件不存在,数组下标越界等
- 异常处理是指程序出现问题时依然可以正确地执行剩余程序,而不会因为异常终止程序
- Python中引进了很多描述和处理异常的类,称为异常类,异常类定义中包含该类异常的信息和异常进行处理的方法。
- 在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象
- 异常采用对象的方法处理:
a. 抛出异常:执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把一场对象提交给解释器
b. 捕获异常:解释器得到该异常后,寻找相应的代码处理异常
二. 异常定位
- 发生异常时,解释器会报相关的错误信息,并会在控制台打印相关的错误信息,我们只需按照从上到下的顺序即可追溯错误发生的过程,最终定位引起错误的那一行代码
三. 异常处理结构
1. try…一个except结构
print("step 1")
try:
print("step 1")
a=3/0
print("step 2")
except BaseException as e:
print("step 3")
print(e)
print(type(e))
print("end")
while True:
try:
x=int(input("请输入一个数字"))
print("输入的数字:",x)
if x==88:
print("退出程序")
break
except:
print("异常,输入的不是一个数字")
print("程序结束")
while True:
try:
x=int(input("请输入一个数字"))
print("输入的数字:",x)
if x==88:
print("退出程序")
break
except ValueError as e:
print(e)
print("异常,输入的不是一个数字")
print("程序结束")
2. try…多个except结构
- 一般建议尽量捕获可能出现的多个异常(按照先子类后父类的顺序),并针对性的写出异常处理代码
- 为了避免遗漏可能出现的异常,可以在最后增加BaseException
try:
a=input("请输入一个被除数")
b=input("请输入一个除数")
c=float(a)/float(b)
print(c)
except ZeroDivisionError:
print("异常,不能除以0")
except ValueError:
print("异常")
except NameError:
print("变量不存在")
except BaseException as e:
print(e)
print(type(e))
3. try…except…else结构和 try…except…finally结构
- 如果try块中没有抛出异常,则执行else块;如果try块中抛出异常,则执行except块,不执行else块
- finally无论是否发生异常都会被执行,通常用来释放try块中申请的资源
try:
a=input("请输入一个被除数")
b=input("请输入一个除数")
c=float(a)/float(b)
except ZeroDivisionError:
print("异常,不能除以0")
except ValueError:
print("异常")
except NameError:
print("变量不存在")
except BaseException as e:
print(e)
print(type(e))
else:
print(c)
finally:
print("我是finally中的语句,无论是否出错,都执行")
print("end")
4. return语句
- 由于return有两种作用,结束方法运行,返回值,一般不把return放到异常处理结构中,而是放到方法中展开
四. 常见异常汇总
- SyntaxError:语法错误
- NameError:尝试访问一个没有申明的变量
- ZeroDivisionError:除数为0
- ValueError:数值错误
- TypeError:类型错误
- AttributeError:访问对象不存在的属性
- IndexError:索引越界异常
- KeyError:字典关键字不存在
五. 自定义异常类
- 自定义异常类一般都是运行时异常,通常继承Exception或其子类即可
- 命名一般以Error,Exception为后缀
- 自定义异常由raise主动抛出
class AgeError(Exception):
def __init__(self,errorInfo):
Exception.__init__(self)
self.errorInfo=errorInfo
def __str__(self):
return str(self.errorInfo)+"年龄错误,应该在1-150之间"
if __name__=="__main__":
age=int(input("请输入一个年龄:"))
if age<1 or age>150:
raise AgeError(age)
else:
print("正常的年龄",age)
六. traceback模块
import traceback
try:
print("step1")
num=1/0
except:
traceback.print_exc()
import traceback
try:
print("step1")
num=1/0
except:
with open(r"C:\Users\13880\Desktop\runtest.txt","a") as f:
traceback.print_exc(file=f)