Python异常处理
一、异常:
异常:在编译阶段没问题,在执行阶段才报错
查看异常:
① 错误代码,从下往上看,找到自己写的代码块
② 根据错误类型判断
二、异常处理
即便放在try语句的内容,在遇到报错之后也会中断这段语句的执行
报错之后,try里面剩余的代码不会执行,但是在try外面的内容还会继续执行
① 单分支
try:
num = int(input('num>>>').strip())
print(111)
except ValueError:
print('输入的非数字')
print(666)
'''
num>>>a
输入的非数字
666
'''
② 多分支
li = [1,2,3,4,5]
try:
num = int(input('num>>>').strip())
print(li[num-1])
except ValueError:
print('输入的非数字')
except IndexError:
print('输入的数字超过列表的长度')
print(666)
'''
num>>>10
输入的数字超过列表的长度
666
'''
③ 合并多分支
li = ['a','b','c']
try :
num = int(input('num>>>').strip())
print(li[num-1])
except (ValueError,IndexError):
print('输入有误')
print(123)
'''
num>>>100
输入有误
123
'''
三、万能异常
Exception 万能异常,一定要配合as语法使用,找出报错的内容
li = ['a','b','c']
try :
import aaa
open('bbbbbb')
li.remove(10)
num = int(input('num>>>').strip())
except Exception as error:
print(error)
print(123)
'''
No module named 'aaa'
123
'''
多分支和万能异常同时存在:
万能异常一定要放在最后,并且加上as语句
四、异常处理中的其他机制
else
如果没发生异常,就执行else语句,但是不能脱离except
else的作用:反馈这段代码顺利执行
当异常发生时,else不执行
try :
a1 = 1
a2 = b
print(a1 + b2)
except NameError:
print('NameError')
else:
print('没异常发生')
'''
NameError
'''
当异常没产生,执行else
try :
a1 = 1
a2 = 2
print(a1 + a2)
except NameError:
print('NameError')
else:
print('没异常发生')
'''
3
没异常发生
'''
finally
finally 无论如何都要执行,即便程序出错和return会也执行finally,能脱离except
finally 一般用于收尾工作,比如:关闭文件,写日志,关闭网络资源,关闭数据库连接
def func():
try:
f = open('a') # 文件存在
return f.readlines()
finally:
f.close()
print('关闭文件') # 虽然return,但执行了finally的代码
func() # 关闭文件
五、主动抛异常
使用关键字 raise语句自己触发异常
语法:raise 异常名(异常的内容(字符串))
raise ValueError('ValueError error')
# raise ValueError('ValueError error')
# ValueError: ValueError error
六、自定义异常
BaseException 异常类的祖宗
使用:继承父类BaseException,实现父类的init,传入异常信息
class CustomException(BaseException):
def __init__(self,msg):
super().__init__()
self.msg = msg
def __str__(self):
return self.msg
raise CustomException('自定义异常')
'''
raise CustomException('自定义异常')
__main__.CustomException: 自定义异常
'''
七、断言
assert 1==1
print(666)
assert 1==2
print(777)
'''
assert 1==2
AssertionError
'''
断言相当于if判断,assert满足才执行下面的代码,如果不满足条件就报错
八、语法总结:
try...except
try...except...else
try...finally
try...except...finally
try...except...else...finally