理解错误类型

Python 主要有几类错误:

  • SyntaxError: 语法错误
  • NameError: 未定义的变量/函数
  • TypeError: 类型错误
  • ValueError: 值错误
  • AttributeError: 属性错误
  • ImportError: 导入错误
  • IndexError: 索引错误
  • KeyError: 字典键错误

阅读错误信息的技巧

Traceback (most recent call last):
  File "script.py", line 10, in <module>  # 错误发生的文件和行号
    some_function()
  File "script.py", line 5, in some_function
    result = 10 / 0  # 具体出错的行
ZeroDivisionError: division by zero  # 错误类型和描述

关键信息:

  • 错误类型(最后一行)
  • 错误发生的具体位置(文件名和行号)
  • 调用栈(从下往上读)

调试技巧

使用 print 调试

def complex_function(data):
    print(f"输入数据: {data}")  # 调试信息
    result = process_data(data)
    print(f"处理结果: {result}")  # 调试信息
    return result

使用 pdb 调试器

import pdb

def problematic_function():
    x = 10
    pdb.set_trace()  # 在这里设置断点
    y = x / 0
    return y

使用 loggingpython

import logging

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)

def function():
    logger.debug("开始执行函数")
    try:
        result = risky_operation()
        logger.info(f"操作成功: {result}")
    except Exception as e:
        logger.error(f"操作失败: {e}")
        raise

异常处理最佳实践

具体异常处理

# 不好的做法
try:
    result = risky_operation()
except:  # 捕获所有异常
    pass

# 好的做法
try:
    result = risky_operation()
except ValueError as e:
    print(f"值错误: {e}")
except TypeError as e:
    print(f"类型错误: {e}")
except Exception as e:
    print(f"未知错误: {e}")
    raise  # 重新抛出未知异常

使用 with 语句

# 自动处理资源清理
with open('file.txt', 'r') as f:
    content = f.read()
# 文件会自动关闭

调试工具推荐

 IDE 调试器

  • PyCharm: 强大的图形化调试器
  • VS Code: 集成调试功能
  • Jupyter: 交互式调试

命令行工具

# 使用 -v 查看详细导入信息
python -v script.py

# 使用 -c 检查语法
python -m py_compile script.py

# 使用 -u 禁用输出缓冲
python -u script.py

预防性编程

类型提示

from typing import List, Dict, Optional

def process_data(data: List[str]) -> Optional[Dict[str, int]]:
    if not data:
        return None
    return {"count": len(data)}

断言

def divide(a: float, b: float) -> float:
    assert b != 0, "除数不能为零"
    return a / b

单元测试

import unittest

class TestMyFunction(unittest.TestCase):
    def test_normal_case(self):
        result = my_function("test")
        self.assertEqual(result, "expected")
    
    def test_edge_case(self):
        with self.assertRaises(ValueError):
            my_function("")

错误排查检查清单

  • 确认错误类型和位置
  • 检查变量值和类型
  • 验证函数参数和返回值
  • 确认导入的模块和函数
  • 检查文件路径和权限
  • 验证网络连接(如果涉及)
  • 检查依赖包版本
  • 查看相关文档和示例

官方文档

  • 官网: https://www.python.org/
  • 文档中心: https://docs.python.org/
  • 中文文档: https://docs.python.org/zh-cn/
  • 语言参考:
    https://docs.python.org/3/reference/
    https://docs.python.org/3/reference/lexical_analysis.html
  • 标准库: https://docs.python.org/3/library/
  • 内置异常: https://docs.python.org/3/library/exceptions.html
  • 异常层次结构: https://docs.python.org/3/library/exceptions.html#exception-hierarchy

在线工具

在线解析器

https://www.jyshare.com/compile/9

https://www.python.org/shell

快速诊断命令

# 检查语法
python -m py_compile your_script.py

# 详细语法检查
python -m py_compile -v your_script.py

# 使用 ast 模块检查语法
python -c "import ast; ast.parse(open('your_script.py').read())"