异常处理
阅读目录:
单分支处理多个异常
l = ['选课','创建学生','退出']
try: num = int(input('>>>')) print(l[num - 1]) except (ValueError,IndexError): # 你处理的是一个valueError print('您输入的内容不合法')
执行结果:
>>>123
您输入的内容不合法
多分支处理
l = ['选课','创建学生','退出'] try: num = int(input('>>>')) print(l[num - 1]) except ValueError: # 你处理的是一个valueError print('请输入一个数字') except IndexError: print('您输入的数字无效')
执行结果:
>>>安不上
请输入一个数字
>>>123
您输入的数字无效
as 语句
使用as语句得到一个错误信息的变量,使用这个变量,就可以知道错误的具体信息
l = ['选课','创建学生','退出'] try: num = int(input('>>>')) print(l[num - 1]) except (ValueError,IndexError) as exp: print('您输入的内容不合法') print('悄悄记录在文件里,不要被用户发现',type(exp),exp)
执行结果:
>>>123
您输入的内容不合法
悄悄记录在文件里,不要被用户发现 <class 'IndexError'> list index out of range
万能异常
能够处理所有的异常
所有的异常处理应该用最基础的最贴近的异常类型去处理它,而不应该乱用万能异常
def func(): name def main(): func() try: main() except Exception as e: print('报错了',e)
执行结果:
报错了 name 'name' is not defined
如果万能异常和其他异常相遇了 : 万能异常永远写在多分支异常的最后
l = ['选课','创建学生','退出'] try: num = int(input('>>>')) print(l[num - 1]) a import times except ValueError: # 你处理的是一个valueError print('请输入一个数字') except IndexError: print('您输入的数字无效') except Exception: print('万能异常')
执行结果:
>>>1
选课
万能异常
else
如果try中的代码没有异常的顺利执行了,就执行else中的代码
l = ['选课','创建学生','退出'] try: num = int(input('>>>')) print(l[num - 1]) except ValueError: # 你处理的是一个valueError print('请输入一个数字') except IndexError: print('您输入的数字无效') else: print('执行我啦') 执行结果: >>>2 创建学生 执行我啦
finnaly
无论如何都会执行 关闭文件\归还系统资源(网络上连接\数据库连接)
遇到return \遇到程序报错结束 都会先执行finally,再return或者报错停止运行
l = ['选课','创建学生','退出'] try: num = int(input('>>>')) print(l[num - 1]) except ValueError: # 你处理的是一个valueError print('请输入一个数字') except IndexError: print('您输入的数字无效') else: print('执行我啦') finally: # 无论如何都会执行 print('finally') 执行结果: >>>123 您输入的数字无效 finally
def func(): try: f = open('file','r') ret = f.read() return ret except Exception: print('报错啦') finally: f.close() #当我们操作一个文件的时候及时遇到了报错,但是也要把打开的文件进行关闭 print('closed') print(func())
raise
try: f = open('file', 'w') ret = f.read() finally: f.close() print('closed') raise ImportError raise 错误类型
什么时候用自定义异常???
class NoCourse(BaseException): def __str__(self): return '没有这个课程' raise NoCourse() 执行结果: __main__.NoCourse: 没有这个课程
assert
assert bool/条件 如果是False就报错,如果是True就继续执行
if 'name' == 'alex' and 'pwd' == 'sb': ... ... ... else: print('如果if条件不满足可以干点儿别的') assert 'name' == 'alex' and 'pwd' == 'sb' # 这是一个必须满足的条件 ... ... ...