加载中...

异常

异常处理

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

print(IndexError.__bases__) # (<class 'LookupError'>,)
print(LookupError.__bases__)  # (<class 'Exception'>,)
print(Exception.__bases__)  # (<class'BaseException'>,)
"""
	Exception 普通异常的父类
	BaseException 在异常处理当中,所有的异常错误类都继承
"""
#try...except...  基础语法  用于解决程序异常问题
#raise 可以主动抛异常,异常类可以自定义

异常的分类

"""
IndexError                索引超出序列的范围
KeyError                  字典中查找一个不存在的关键字
NameError                 尝试访问一个不存在的变量
IndentationError          缩进错误
AttributeError            尝试访问未知的对象属性
StopIteration             迭代器没有更多的值
AssertionError			 断言语句(assert)失败
EOFError                  用户输入文件末尾标志EOF(Ctrl+d)
FloatingPointError        浮点计算错误
GeneratorExit             generator.close()方法被调用的时候
ImportError               导入模块失败的时候
KeyboardInterrupt         用户输入中断键(Ctrl+c)
MemoryError               内存溢出(可通过删除对象释放内存)
NotImplementedError       尚未实现的方法
OSError                   操作系统产生的异常(例如打开一个不存在的文件)
OverflowError             数值运算超出最大限制
ReferenceError            弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
RuntimeError              一般的运行时错误
SyntaxError               Python的语法错误
TabError                  Tab和空格混合使用
SystemError               Python编译器系统错误
SystemExit                Python编译器进程被关闭
TypeError                 不同类型间的无效操作
UnboundLocalError         访问一个未初始化的本地变量(NameError的子类)
UnicodeError              Unicode相关的错误(ValueError的子类)
UnicodeEncodeError        Unicode编码时的错误(UnicodeError的子类)
UnicodeDecodeError        Unicode解码时的错误(UnicodeError的子类)
UnicodeTranslateError     Unicode转换时的错误(UnicodeError的子类)
ValueError                传入无效的参数
ZeroDivisionError         除数为零
"""

常见异常例子

# IndexError                索引超出序列的范围
# lst = [1,2,3]
# lst[1000]

# KeyError                  字典中查找一个不存在的关键字
# dic = {"a":1,"b":2}
# dic["c"]

# NameError                 尝试访问一个不存在的变量
# print(wangwen112312313123123123123123123123123123s)

# IndentationError          缩进错误
# if 5 == 5:
	# print(1)
 # print(2)


# AttributeError            尝试访问未知的对象属性
# class MyClass():
	# a = 100
# obj = MyClass()
# obj.abc


# StopIteration             迭代器没有更多的值
# it = iter(range(3))
# res = next(it)
# res = next(it)
# res = next(it)
# res = next(it)

# AssertionError			 断言语句(assert)失败
"""assert猜的意思 , 叫断言, 
如果是正确的没有任何反应,代码正常执行
如果是错误的直接报错,终止程序
"""
# assert 5 < 3
# print(111)

异常处理

基本语法

class MyClass():
	a = 6

try:
	lst = [1,2,3]
	lst[1000]
except:
	pass
	

try:
	lst = [1,2,3]
	lst[1000] 
except BaseException:  # 可省略BaseException
	pass

异常分支

"""
	只选择一个except执行
"""
try:
	# lst = [1,2,3]
	# lst[1000]
	
	# dic = {"a":1,"b":2}
	# dic["c"]
	
	# print(lisi)
	
	MyClass.abc()
except IndexError:
	print("下标越界1")
except KeyError:
	print("字典的键不存在2")
except NameError:
	print("这个变量不存在的3")
except :
	print("有异常错误4")

迭代器的异常

def mygen():
	yield 1
	yield 2
	yield 3
	return 1

try:
	gen = mygen()
	print(next(gen))
	print(next(gen))
	print(next(gen))
"""
	在 Python 中,在迭代器中写了 return 语句之后再写 yield 是会触发语法错误的。因为 return 语句会结束函数的执行并返回值,而迭代器函数应该在整个迭代过程中保持挂起状态,直到调用了 next() 方法才会执行到 yield 语句处。
"""
	print(next(gen))
	
	# 给StopIteration这个类创建出来的对象起一个别名叫e
	""" 
	当你打印对象时,会触发内部__str__方法,通过一些列的调用,返回出最后的返回值
	next的call方法可能内部带有str魔术方法
	"""
except StopIteration as e:
	# 可以获取返回值
	print(e)
	
	"""
	# 额外的扩展
	res = str(e)
	print(res , type(res) ,  "<======>")
	res2 = eval(res)
	print(res2,type(res2))
	"""

异常处理的写法

1 .try .. except .. else ..

"""
	当try这个代码块当中没有报错的时候,执行else这个分支
	如果try代码块有报错,就不执行else这个分支
"""

try:
	# lst = [1,2,3]
	# lst[1000]
	print(123)
except:
	pass
else:
	print("执行了else分支 ... ")

2.try .. finally ...

"""
	无论代码是否报错,都必须要执行的代码写在finally这个代码块当中
	场景:应用在异常环境下,保存数据或者关闭数据库等操作,必须要在数据库程序崩溃之前执行的代码写在finally代码块中
"""

try:
	lst = [1,2,3]
	lst[1000]
finally:	
	print("执行关闭数据库操作")

3.try .. except .. else .. finally

try:
	lst = [1,2,3]
	lst[1000]
	# print(123)
	
except:
	print(456)
else:
	print("执行了else分支 ... ")
finally:
	print("执行关闭数据库操作")

主动抛异常

BaseException 所有异常类的父类
Exception 普通异常类的父类
raise + 异常错误类 / 异常错误类对象

基本语法

# raise KeyError
# raise KeyError()
"""
try:
	raise 
except:
	pass

try:
	raise 
except BaseException:
	pass
"""

自定义异常错误类

"""必须继承异常类的父类 BaseException """





# return_errorinfo必须在报错的情况下才能触发内部相应方法获取当前行号和文件名
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_info(n):
	try:
		raise 
	except:
		return return_errorinfo(n)
    
    
    
    


# 自定义异常错误类
class MyException(BaseException): # 必须继承异常父类
	def __init__(self,error_num,error_msg,error_filename,error_linenum):
		self.error_num = error_num
		self.error_msg = error_msg
		self.error_filename = error_filename
		self.error_linenum = error_linenum

eye = "轮回眼"
try:
	if eye == "轮回眼":
		raise MyException( 404,"人类没有轮回眼",get_info(2) , get_info(1) )		 
		
except MyException as e: #给自定义MyException异常类的对象起个别名叫做e
	print(e.error_num)
	print(e.error_msg)
	print(e.error_filename)
	print(e.error_linenum)


posted @ 2024-03-17 22:21  江寒雨  阅读(42)  评论(0)    收藏  举报