
在 Python 编程里,数组(或列表,在 Python 中常用列表来模拟数组的功能)越界是一个较为常见且容易引发程序错误的问题。下面通过一个具体案例来深入了解数组越界 Bug 的产生与修复过程,并进一步学习如何添加异常处理来增强程序的健壮性。初期学习python的友友可以参考.
案例场景:学生成绩统计系统
假设目前正在开发一个简单的学生成绩统计系统,用于统计某班级学生在一次考试中成绩大于等于 90 分的人数。以下是初始代码
# 存储学生成绩的列表
scores = [85, 92, 78, 95, 88, 90, 76, 98, 82]
# 用于统计高分人数
high_score_count = 0
for i in range(len(scores) + 1): # 此处埋下隐患
if scores[i] >= 90:
high_score_count += 1
print(f"成绩大于等于 90 分的学生人数为:{high_score_count}")
Bug 出现:索引错误
当运行上述代码,立即得到 IndexError: list index out of range 错误。这表明程序试图访问列表中不存在的索引位置。
排查过程
错误信息解读:看到错误提示后,第一时间明白是索引超出了列表 scores 的有效范围。在 Python 中,列表索引是从 0 开始,到 len(scores) - 1 结束。
代码逻辑审查:仔细查看循环部分代码 for i in range(len(scores) + 1):,这里本意可能是想遍历整个列表,但却错误地多循环了一次。因为 range(len(scores) + 1) 会生成一个从 0 到 len(scores) 的整数序列,当 i 取到 len(scores) 这个值时,再去访问 scores[i] 就超出了列表范围,因为 scores 最大有效索引为 len(scores) - 1。
修复思路与对应方法
将循环条件修正为正确的范围,即 for i in range(len(scores)):,这样就能确保在列表有效索引范围内进行遍历:
scores = [85, 92, 78, 95, 88, 90, 76, 98, 82]
high_score_count = 0
for i in range(len(scores)): # 修复后的循环
if scores[i] >= 90:
high_score_count += 1
print(f"成绩大于等于 90 分的学生人数为:{high_score_count}")
修复后重新运行程序,顺利得到正确结果:成绩大于等于 90 分的学生人数为:5 。
添加异常处理
虽然代码已经修复了数组越界的问题,但为了让程序更加健壮,能够应对一些潜在的异常情况,我们可以进一步添加异常处理机制。例如,考虑到成绩列表中的数据可能因为某些原因(如数据录入错误、数据源损坏等)出现非数字类型的数据,这时候访问列表元素进行比较运算就会引发 TypeError 异常。
以下是添加异常处理后的代码:
scores = [85, 92, 78, 95, 88, 90, 76, 98, 82]
high_score_count = 0
try:
for i in range(len(scores)):
if scores[i] >= 90:
high_score_count += 1
except (IndexError, TypeError) as e:
print(f"程序出现异常:{e}")
finally:
print(f"成绩大于等于 90 分的学生人数为:{high_score_count}")
在这段代码中,使用 try-except-finally 结构来捕获可能出现的异常。如果在循环遍历成绩列表过程中,出现了索引越界(IndexError)或者数据类型错误(TypeError),程序不会直接崩溃,而是会打印出相应的异常信息,然后继续执行 finally 块中的代码,输出统计结果(即使结果可能因为异常而不准确,但至少程序不会意外终止)。这样,程序在面对一些意外情况时表现得更加稳健,能够给用户提供更友好的反馈。
通过这个案例可以看出,对于涉及列表遍历的操作,一定要格外小心索引的范围。一个小小的疏忽,如在 range 函数中设置了错误的参数,就可能引发数组越界错误。同时,合理添加异常处理机制能够大大提升程序的健壮性,使其在复杂多变的运行环境中更好地发挥作用。若不幸遇到问题,依据错误信息精准定位问题代码段,分析索引使用的合理性,结合异常处理,即可快速修复并保障程序稳定运行。
任何学习的过程都充满挑战性。需要我们耐心的去克服 加油。


445

被折叠的 条评论
为什么被折叠?



