第七章 程序调试方法 异常 崩溃
学习目标 1 3 2 重点 了解 掌握 重点 了解 掌握 异常处理 异常的概念 崩溃信息 Try-except-finally 使用raise主动抛出异常 程序调试
7.1 7.2 7.3 章节框架 计算学生平均成绩 对学生成绩进行排名 实践技能训练 ☞点击查看本小节知识架构 ☞点击查看本小节知识架构
7.1 异常概述 【任务描述】: 实现一个计算学生平均成绩的程序,每一次录入成绩的人可能不同,所以为了避免粗心的同学将成绩录错而闹笑话,需要在程序中利用异常处理机制来处理出现的异常情况 。
7.1 异常 什么是异常?
异常概述 1、认识异常 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在python无法正常处理程序时就会发生一个异常 。 异常是python对象,表示一个错误。当python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
异常概述 【样例1】要求完成一个计算学生平均成绩的程序,有同学写了以下函数: def mean_points(score=[],names=[]): all_score=sum(score) mean_score=all_score/len(names) return mean_score score=[83,78,69,93,57] mean_score=mean_points(score) print(mean_score) 录入成绩的小明使用这个函数来计算学生平均成绩,总共有5名同学的成绩,分别是:张三、小明、李雷、韩梅梅、王美美,他们的成绩分别是:83、78、69、93、57。为何会出现异常呢?
异常概述 在python中类似的异常有很多,常见的有以下这些: NameError 2、常见的异常 在python中类似的异常有很多,常见的有以下这些: NameError 当程序尝试访问一个未声明的变量或函数时,会引发NameError异常。 【样例2】变量名输错时,在调用的时候会引发NameError异常。 score=80 print(socre)
异常概述 ZeroDivisionError 在计算过程中,当有除数为0的情况发生时,会引发ZeroDivisionError异常。 SyntaxError 当程序出现语法错误时,会引发SyntaxError异常。 list=[‘a’,’b’,’c’] for i in list print(i)
异常概述 IndexError 当使用序列中不存在的索引时,会引发此异常。 list=[‘a’,’b’,’c’] print(list[3])
异常概述 keyError 当使用字典中不存在的键时,会引发此异常。 dictionary=[‘name’:’zhangsan’] print(dictionary[‘age’])
异常处理 异常处理 异常处理就是异常预测,预先想好一些处理方法。若发生异常,程序会按照预定的处理方法对异常进行处理。 python提供的try-except语句和try-except-finally语句都非常方便地处理异常。 常见的异常名称: BaseException 所有异常错误 Exception 常规异常错误 ZeroDivisionError 除0异常错误 ValueError 值类型异常错误
异常处理 使用try-except处理异常 python提供的try-except语句进行异常的捕获和处理,把可能出现的异常代码放入try语句块中,并使用except语句来处理异常。 【语法】 Try: 语句块一 #检测语句一是否存在错误 except errorname1: 语句块二 #若语句块一触发此异常,运行语句块二 Except errorname2 as e: 语句块三 Except: 语句块四 Else: 语句块五
异常处理 【样例2】在样例1中,小明在使用mean_points函数计算同学的平均成绩时,因为粗心导致程序出现异常,现需改进mean_points函数,对粗心的工作做一下预防,也对可能发生异常的地方做一下补救,让程序不会因为一些粗心的异常导致崩溃。 def mean_points(score=[],names=[]): try: all_score=sum(score) mean_score=all_score/len(names) print('学生平均分是:%.2f'%(mean_score)) except ZeroDivisionError: print('出现了被除数为0的情况,很可能是没有添加学生名字列表') else: print('运行成功') score=[83,78,69,93,57] # names=['张三','小明','李雷','韩梅梅','王美美'] mean_points(score)
异常处理 【课堂练习】使用异常处理,避免程序运行出现崩溃,为样例3mean_points函数中添加功能,在输出的结果中可以显示每一位同学高于或低于平均分多少 分。
异常处理 使用try-except-finally进行异常处理 python提供的try-except-finally语句进行异常处理。 【语法】 try: 语句块一 #检测语句一是否存在错误 except 异常名称: 语句块二 #若语句块一存在错误,可捕获错误 finally: 语句块三 #无论是否存在错误,都会执行finally内代码
异常处理 【样例3】在课堂练习中的mean_points()函数中添加一个功能,要求无论输入什么内容,都能输出时间戳。 import datetime def mean_points(score=[],names=[]): try: all_score=sum(score) mean_score=all_score/len(names) print('学生平均分是:%.2f'%(mean_score)) for i in range(len(score)): print('%s比平均分高:%d'%(names[i],score[i]-mean_score)) except ZeroDivisionError: print('出现了被除数为0的情况,很可能是没有添加学生名字列表') except BaseException as e: print('出现了%s错误,请仔细检查'%e) finally: print('现在的时间是:%s'%(datetime.datetime.today())) score=[83,78,69,93,57] names=['张三','小明','李雷','韩梅梅'] mean_points(score,names) mean_points(score)
异常处理 使用raise抛出异常 Python中需要在程序中主动抛出异常,执行这种操作可以使用raise语句。一旦引发raise后面的异常,将终止程序运行。 【语法】 raise ErrorName # 抛出ErrorName异常 raise ErrorName() # 抛出ErrorName异常
异常处理 【样例4】需求1: 1、传入一个参数,判断是否为整型类型,如果不是,则抛出异常,终止程序。 2、判断是否大于等于5,如果小于 5,则抛出异常,终止程序。 def f1(num): if not isinstance(num,int): raise Exception('该参数不是整型类型') if num<5: raise Exception('该参数小于5') f1(4)
异常处理 【课堂练习】需求: 传入若干个参数,判断参数个数如果小于等于5,则抛出异常,终止程序。
异常处理 assert断言 指的是期望用户满足指定的条件。 【语法】 assert 逻辑表达式,data # data是可选
异常处理 【样例5】需求1: 1、传入一个参数,判断是否为整型类型,如果不是,则抛出异常,终止程序。 2、判断是否大于等于5,如果小于 5,则抛出异常,终止程序。 def f4(num): assert isinstance(num,int),"该参数不是整型类型" assert num>=5,'该参数小于5' f4(12)
异常处理 【课堂练习】需求: 用assert断言实现:传入若干个参数,判断参数个数如果小于等于5,则抛出异常,终止程序。
技能训练 设计一个小游戏“谁先走到17谁就赢”。规则如下: 有两位参赛者,参赛者每次可以选择走1步、2步、3步。 两位参赛者交替走,谁走的路程相加先等于17谁获胜。 如果一方超过了17则判断为输,另一方直接记得比赛。 要求在控制台交互,无论用户输入什么,程序都不能崩溃,并给出提示,引导用户输入正确的内容,例如:输入走几步的时候,如果没有输入1、2、3中的任意数字,需提示输入有误,请重新输入。
7.2 崩溃 【任务描述】: 小明想用冒泡排序算法对一个列表中的学生成绩进行排名,最终找出成绩最好的前三名进行奖励,但是小明在实现冒泡排序算法时遇到了困难,需要咱们帮忙帮他找出错误。
异常概述 1、认识崩溃 崩溃是调试异常的第一步,也是程序设计人员的基本功 。 崩溃是程序运行过程中出现异常而崩溃时,打印出来的异常位置和异常信息。 【样例6】小明所写的冒泡排序算法如下: def sort(ls): for i in range(len(ls)-1): for j in range(len(ls)-i): if ls[j]>ls[j+1]: ls[j],ls[j+1]=ls[j+1],ls[j] return ls points=[86,73,89,91,77,63,68,69,84,51] order_points=sort(points) print(order_points)
异常概述 2、利用pycharm 进行debug 主要介绍利用pycharm进行断点调试。 设置断点 进入调试模块界面(点击小蜘蛛按钮)。 常用快捷键 F7:按顺序逐行执行,如遇到函数,会进入到函数内,并在调试界面中显示运行该行代码后得到的变量信息。 F8:单步执行。如果遇到函数,不进入函数,直接外跳到下一行。 F9:运行下一个断点处,适合快速调试。 Shift+F8:跳出函数。
异常概述 【样例7】对样例6小明所写的冒泡排序算法如下调试排错: def sort(ls): for i in range(len(ls)-1): for j in range(len(ls)-i): if ls[j]>ls[j+1]: ls[j],ls[j+1]=ls[j+1],ls[j] return ls points=[86,73,89,91,77,63,68,69,84,51] order_points=sort(points) print(order_points) def sort(ls): for i in range(len(ls)-1): for j in range(len(ls)-i-1): if ls[j]>ls[j+1]: ls[j],ls[j+1]=ls[j+1],ls[j] return ls points=[86,73,89,91,77,63,68,69,84,51] order_points=sort(points) print(order_points)
课堂作业 找出下面的问题所在,并修改好: 下面这段代码是使用python实现将列表中的数与它相邻的数求均值并输出。例如:ls=[15,8,7,9,8] 输出结果为: [11.5,10,8,8,8.5] 可以看出,中间的数是与其左右两个数一起求均值,而第一个数和最后一个数则只与其相邻的一个数求均值。函数代码如下: def mid_mean(ls): new_list=[] for i in range(len(ls)): new_item=(ls[i-1]+ls[i]+ls[i+1])/3 new_list.append(new_item) return new_list ls=[15,8,7,9,8] mid_mean(ls)
本章小结 本章小结 本章首先讲解了异常和崩溃概念,然后讲解了异常处理、pycharm的debug调试等。通过本章的学习,读者应该能够熟练掌握异常以及调试。