Python异常处理

一、认识异常处理

程序错误分为两种: 语法错误和异常错误
语法错误:代码没有按照python规定语法去写,发明创造产生的错误
异常错误:在代码语法正确的前提下,程序报错就是异常

1、IndexError报错

超出索引范围

lst = [1,2,3,4]
print(lst[100])

运行结果:
运行结果

2、KeyError报错

字典中查找一个不存在的关键字

dic={"key1":"value1","key2":"value2"}
res=dic["key3"]
print(res)

运行结果:
运行结果

3、NameError报错

尝试访问一个不存在的变量

name="Lsir"
print(age)

运行结果:
运行结果

4、IndentationError报错

缩进错误

name="Lsir"
	print(name)

运行结果:
运行结果

5、AttributeError报错

尝试访问未知的对象属性

class MyClass():
	name="Lsir"

obj=MyClass()
obj.age()

运行结果:
运行结果

6、StopIteration报错

迭代器没有更多的值:

def mygen():
	yield 1
	yield 2
	yield 3
	return 4
it=mygen()
for i in it:
	print(i)
res=next(it)
print(res)

运行结果:
运行结果

7、AssertionError报错

断言语句失败

assert 3>10

运行结果:
运行结果

二、异常处理的基本语法

1、基本语法

try … except …
把有问题的代码放到try这个代码块中
如果出现了异常会直接执行except这个代码块中的内容
作用:防止异常报错,终止程序

try:
	lst=[1,2,3]
	print(lst[100])
except:
	print("存在异常报错")

运行结果:
运行结果

2、带有分支的异常处理

except + 异常错误类 特指发生在这类错误时,要执行的分支

try:
	dic={"key1":"value1"}
	lst=[1,2,3]
	print(dic["key2"])
except IndexError:
	print("超出索引范围")
except KeyError:
	print("不存在的关键字")

运行结果:
运行结果

3、处理迭代器异常错误

try:
	def mygen():
		yield 1
		yield 2
		yield 3
		return 4
	it=mygen()
	res1=next(it)
	print(res1)
	res2=next(it)
	print(res2)
	res3=next(it)
	print(res3)
	res4=next(it)
	print(res4)
except StopIteration as e:
	print(e)
	print("程序执行完毕")

运行结果:
运行结果

代码分析:
正常来讲,上述迭代器迭代到第四次时会产生StopIteration报错,但我们使用了try…except…进行分支处理,在StopIteration中,当我们print对象时会自动触发类中的__str__魔术方法,将返回值打印出来

三、主动抛出异常

raise + 异常错误类 or 异常错误类对象

BaseException 所有异常类的父类
Exception 常见异常类的父类

1 、基本语法

try:
	raise BaseException
except BaseException:
	pass

运行结果:
运行结果

简写:

try:
	raise
except:
	pass

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 #返回文件名
# 通过get_value 主动抛出异常
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
info="error"
try:
	if info == "error":
		raise MyException(404,"告警级别error",get_value(1),get_value(2))
except MyException as m:
	print(m.num)
	print(m.msg)
	print(m.line)
	print(m.file)

运行结果:
运行结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值