# 1.什么是异常处理?
"""
当程序出错的时候就会抛出异常,比如IndexError\ KeyError\ NameError\ IndentationError\ AttributeError\ StopIteration\ AssertionError(测试领域)等
作用: 防止异常错误终止程序
"""
# 1.1 什么是断言语句 assert?
"""
断言就是猜一猜后面的表达式是否正确,猜对了无反应,猜错了报错
if 语句判定时选择执行或者不执行, assert 语句判定时选择报错或者不报错
"""
# 2.异常处理的基本语法
"""
1. try ... except ...
把 有问题的代码 放进try, 如果出现异常了, 直接 执行except代码块
2. try ... except + 异常错误类
把 有问题的代码 放进try, 如果出现异常了, 直接 执行except代码块, 只是由于加上了异常错误类,except执行精度更高了
3. try ... except StopIteration as e
StopIteration 是异常错误类,刚给这个类的对象起了一个别名叫e
__str__ 当在打印对象时,自动触发,自动接收return的返回值
例子:(处理迭代器的异常错误)
def mygen():
yield1
yield2
return "haha"
gen = mygen() # 初始化生成器函数 => 生成器
try:
res = next(gen)
res = next(gen)
res = next(gen)
except StopIteration as e:
print("迭代器取值错误,越界")
print(e)
# 迭代器取值错误,越界
# haha
"""
# 2.1 异常处理的其他写法
"""
1. try ... finally ...
不论代码是否报错,都必须要执行的代码放到finally中
因为我想在程序报错的情况下,也看到相应的执行过的值
例子:
try:
lst = [1,2,3,4]
print(lst[100])
finally:
print(2)
print(3)
print("end结束")
print(666)
print(888)
# 2
# 3
# end结束
2. try ... except ... else ...
如果try代码块没有报错,就执行else这个分支,如果报错了,就不执行else分支
类比for/ while ... else 来记忆,遇到break后,不执行else部分
"""
# 3.主动抛异常 raise
"""
raise + 异常错误类 or 异常错误类对象
BaseException 所有异常类的父类
Exception 常规异常类的父类
"""
# 3.1 基本语法
"""
try:
raise BaseException
except BaseException:
print(11)
try:
raise # (默认接收的都是BaseException)
except:
print(11)
"""
# 3.2 自定义异常类 MyException (继承父类BaseException)
#(了解)系统底层获取行数和文件名的函数( 只有在程序异常时才能触发 )
def return_errorinfo(n):
import sys
f = sys.exc_info()[2].tb_frame.f_back
if n==1:
return str(f.f_lineno) #返回当前行数
elif n == 2:
return f.f_code.co_filename #返回文件名
# 只有在抛出错误的时候,里面的行号和文件名才能获取到
def get_value(n):
try:
raise
except:
return return_errorinfo(n)
class MyException(BaseException):
def __init__(self,num,msg,line,file):
# 错误号
self.num = num
# 错误信息
self.msg = msg
# 错误行号
self.line = line
# 错误文件
self.file = file
sex = "雌雄同体"
try:
if sex == "雌雄同体":
# raise + 异常错误类对象 => 主动抛异常
raise MyException(404,"人类没有雌雄同体",get_value(1),get_value(2))
# 给MyException的类对象起别名叫做e
except MyException as e:
# 对象.属性
print(e.num) # 404
print(e.msg) # 人类没有雌雄同体
print(e.line)# 59
print(e.file)# E:/python30/day26/3.py
python_learn 异常处理及常见异常
最新推荐文章于 2020-09-21 17:08:27 发布