Python程序调试和异常处理技巧
2026/8/5 12:30:49 网站建设 项目流程

常见的错误

语法错误

  • 错误的缩进——引发IndentationError
  1. s = 1 i = 5 result = s + i print(result)#缩进错误
  2. if s > i: print('123') else: print('0000')
  • 未定义的变量
  • 括号不匹配等

运行时错误

  • 尝试访问不存在的文件
with codecs.open('./binary_data.bin',mode='rb',encoding=None) as file: binary_data = file.read() print(binary_data)
  • 内存溢出

类型错误——TypeError

  • 将字符串与整数相加等
  • 使用None进行算数运算或比较
  • 将不同类型的值转换为预期类型
  • 函数的期望类型与传递给它的实际类型不匹配
s = "hello" i = 5 #can only concatenate str (not"int") to str result = s + i print(result)

逻辑错误:

程序没有按照预期的流程执行,条件判断不正确

输入错误:

无效的输入、输入的数据类型不正确等

索引错误

  • 索引超出序列范围——IndexError
my_list = [1,2,3] print(my_list[4])
  • 尝试从一个空(没有元素)的序列(如列表、元组)中获取元素——IndexError
  • 从字典中获取一个不存在的键——KeyError
  • 进行切片操作时,如果切片索引超出范围——IndexError

常见的错误提示词

  • SyntaxError——语法错误,例如代码编写不符合Python的语法规则
  • IndentationError——缩进错误,例如代码不正确
  • NameError——名称错误,通常是由于引用了未规定或不存在的变量、函数或模块
  • TypeError——类型错误,例如使用了不兼容的数据类型或对数据类型的操作不正确
  • ValueError——值错误,通常是由于传入的参数值不符合预期要求
  • IndexError——索引错误,通常是由于访问序列(列表,字符串等)时使用了无效的索引或超出了索引范围
  • KeyError——键错误,通常是在字典中 查找或访问不存在的键时出现
  • FileNotFoundError——文件未找到错误,通常是由于尝试打开或操作不存在的文件时引发
  • IOError——输入/输出错误,通常是由于读取或写入文件时发生了错误
  • ZeroDivisionError——零除错误,通常是由于除法运算中除数为零导致的异常

异常处理的方法

  1. try except
try: #可能引发异常的代码 except ExceptionType: #处理该异常的代码 else: #没有异常发生时执行的代码
  1. finally
try: #尝试执行代码 except ExceptionType: #当异常发生时执行的代码 finally: #无论是否发生异常都会执行的代码
def divide_numbers(dividend,divisor):#接受两个参数 try: result = dividend / divisor#使用try块进行除法操作 print("The result is:",result)#将结果储存在变量result中 except ZeroDivisionError: print("Error:Division by zero is not allowed.")#如果除数为0,将引发ZeroDivisionError异常 finally: print("This is the finally block.") #调用函数并传入参数 divide_numbers(10,2) divide_numbers(10,0)
  1. raise用于手动引发一个异常
try: #可能引发异常的代码 x = 1 / 0 except Exception as e: #处理Exception异常 print("Error:",str(e)) raise #手动引发异常

调试技巧

  • 断点调试:
    • 在代码行号旁双击设置断点(红色圆点)
    • 点击调试按钮(甲壳虫图标)启动调试模式
    • 可以查看变量当前值和执行流程
  • 调试工具:
    • 单步执行:逐步执行代码
    • 步入:进入函数内部
    • 步出:从当前函数返回
    • 运行到光标处:直接执行到指定位置
  • 调试器窗口:
    • 显示当前执行位置和调用栈
    • 可以查看局部变量和它们的值
    • 支持表达式求值和添加监视
  • 调试建议:
    • 在可能出错的位置前设置断点
    • 通过单步执行观察程序流程
    • 检查变量值是否符合预期
    • 不要过度依赖调试,应先理解代码逻辑

异常处理原则

  • 核心目的:
    • 捕获和处理异常
    • 保证程序稳定执行
    • 提供友好的错误信息
  • 使用建议:
    • 根据业务需求选择合适的异常处理方式
    • 不要滥用try-except,只捕获预期可能发生的异常
    • 异常处理不是性能优化的替代品
    • 保持异常处理代码简洁清晰
  • 最佳实践:
    • 记录详细的错误日志
    • 给用户提供有意义的错误信息
    • 在finally中释放资源
    • 避免空的except块

常见异常汇总

以下表格汇总了 Python 编程中常见的异常类型、触发场景及典型示例,便于快速查阅和诊断。

异常类型触发场景典型示例处理建议
SyntaxError代码不符合 Python 语法规则print('hello' # 缺少右括号检查括号、引号、冒号等语法符号是否配对
IndentationError缩进不正确(属于 SyntaxError 子类)
def foo(): print('indented wrong')
统一使用空格或制表符,保持同一代码块缩进一致
NameError引用未定义的变量、函数或模块print(undefined_var)检查变量名拼写,确认变量是否在作用域内定义
TypeError操作或函数应用于不兼容类型的对象'hello' + 123检查操作数类型,必要时使用类型转换(如str()int()
ValueError传入参数类型正确但值不合法int('abc')验证输入数据的有效性,使用try-except捕获并提示
IndexError序列(列表、元组、字符串)索引超出范围lst = [1,2,3]; print(lst[5])访问前检查序列长度,使用len()判断边界
KeyError字典中访问不存在的键d = {'a':1}; print(d['b'])使用dict.get(key, default)或先检查key in dict
FileNotFoundError尝试打开不存在的文件open('missing.txt', 'r')检查文件路径是否正确,或使用os.path.exists()预先判断
ZeroDivisionError除法或取模运算中除数为零10 / 0对除数进行非零校验,或使用try-except捕获
AttributeError对象没有指定的属性或方法lst = [1,2]; lst.appendd(3)检查属性/方法名拼写,确认对象类型是否支持该操作
ImportError / ModuleNotFoundError导入模块失败(模块不存在或路径问题)import non_existent_module检查模块名拼写、安装情况以及 Python 路径(sys.path
KeyboardInterrupt用户按下中断键(如 Ctrl+C)在循环或输入等待时按下 Ctrl+C通常用于优雅退出,可在try-except中清理资源
MemoryError内存不足,无法分配所需对象创建超大型列表或递归过深优化数据结构,使用生成器、分块处理,或增加系统内存
OverflowError数值运算结果超出类型表示范围import math; math.exp(1000)使用更高精度的数据类型(如decimal.Decimal)或检查运算边界

扩展说明:

  • 多数内置异常都继承自BaseExceptionException,可通过try-except捕获。
  • 自定义异常应继承Exception类,以便与内置异常保持一致的捕获机制。
  • 使用except Exception as e:可捕获所有非系统退出的异常,但建议根据具体场景捕获特定异常。
  • 在开发中,结合日志记录(logging模块)和详细的错误信息能大幅提升调试效率。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询