2.2.4-异常处理.md

知识库

2.2.4 异常处理

异常处理机制用于捕获错误并做出相应的处理,从而提高程序的稳健性和容错能力,提升用户体验。程序在运行过程中可能遇到除以零、访问已被删除的变量、列表中找不到要删除的元素、用方括号读取字典中不存在的键、打开不存在的文件等情况。若不加处理,解释器会抛出异常并中断程序。Python 提供 try-except 结构来实现异常处理:把可能出错的执行代码放在 try 块中,一旦执行过程中发生异常,程序会跳到对应的 except 异常处理代码块进行处理,从而避免程序直接崩溃,并向用户给出可读的提示。

try-except 的一般形式为:try 后面写执行代码块,except 后面写异常处理代码块;try 与 except 后面的冒号必不可少,其下代码块必须保持同一级缩进。课程示例将 result = 10 / 0 放在 try 中,except 中执行 print("除零错误"):

try:
    result = 10 / 0
except:
    print("除零错误")

执行时 10 除以 0 会引发异常,程序不会在 try 内继续,而是转入 except,输出“除零错误”,之后还可以继续运行 try-except 之后的语句。如果 try 中没有发生异常,则跳过 except,按正常流程执行。

本章前面已经出现过若干常见运行时异常,都可以用同一套结构捕获:用 del 删除变量后再访问会引发 NameError;把内置函数 list 覆盖为变量后再调用 list('abc') 会引发 TypeError;列表的 remove()、index() 找不到指定元素会引发 ValueError;pop() 在列表为空或索引超出范围时会引发 IndexError;用方括号访问字典中不存在的键会引发 KeyError,可用 get() 避免。教案还要求编写程序尝试打开一个不存在的文件并捕获异常,这与后续 open() 文件操作衔接,同样是把打开文件的语句放入 try、在 except 中给出提示。

使用时要注意几个常见坑。第一,try 块应只包裹真正可能出错的语句,不要把无关代码一并塞进去,否则一旦异常发生,try 中尚未执行的语句会被跳过,排查更困难。第二,课程示例使用不指定类型的 except,能捕获各类异常,便于入门;但若静默忽略或提示过于笼统,可能掩盖真正的错误原因,实际编程应给出明确提示。第三,异常处理不能代替事先检查:能用条件判断预防的(例如除数是否为 0、键是否在字典中),应优先判断;对难以事先完全预判的运行时错误,再用 try-except 兜底。二者配合,才能写出更稳健的程序。

关键要点

下载此文件