Python报错信息归类以及处理

ʕ ᵔᴥᵔ ʔ

Python 的错误和异常可以分为多个类别,了解这些类别有助于更好地调试和处理错误。以下是 Python 中常见报错信息的归类和分析。

1. 语法错误 (SyntaxError)

在代码执行前被解析器捕获的错误,通常是由于代码不符合 Python 语法规则。

常见子类

  • IndentationError:缩进错误
  • TabError:Tab 和空格混用

示例

# 缺少冒号
if True
    print("Hello")  # SyntaxError: invalid syntax

# 缩进错误
def func():
print("Hello")  # IndentationError: expected an indented block

2. 异常 (Exceptions)

程序运行时发生的错误,即使语法正确也可能发生。

2.1 内置异常基类

  • BaseException:所有异常的基类
    • Exception:所有非系统退出异常的基类
    • SystemExit:解释器请求退出
    • KeyboardInterrupt:用户中断执行(通常是 Ctrl+C)

2.2 常见内置异常

2.2.1 与变量和属性相关
  • NameError:访问未声明的变量
    print(undefined_var)  # NameError: name 'undefined_var' is not defined
    
  • AttributeError:访问对象不存在的属性
    "hello".nonexistent_method()  # AttributeError: 'str' object has no attribute 'nonexistent_method'
    
2.2.2 与索引和键相关
  • IndexError:序列下标超出范围
    lst = [1, 2, 3]
    print(lst[3])  # IndexError: list index out of range
    
  • KeyError:字典中不存在的键
    d = {'a': 1}
    print(d['b'])  # KeyError: 'b'
    
2.2.3 与类型相关
  • TypeError:操作或函数应用于不适当类型的对象
    1 + "1"  # TypeError: unsupported operand type(s) for +: 'int' and 'str'
    
  • ValueError:操作或函数接收到类型正确但值不合适的参数
    int("abc")  # ValueError: invalid literal for int() with base 10: 'abc'
    
2.2.4 与输入/输出相关
  • FileNotFoundError:请求的文件或目录不存在
    open("nonexistent.txt")  # FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent.txt'
    
  • PermissionError:没有足够的权限执行操作
  • IsADirectoryError:预期是文件但实际是目录
  • NotADirectoryError:预期是目录但实际是文件
2.2.5 与数学运算相关
  • ZeroDivisionError:除数为零
    1 / 0  # ZeroDivisionError: division by zero
    
  • OverflowError:数值运算结果太大无法表示
  • FloatingPointError:浮点运算失败
2.2.6 与导入相关
  • ImportError:导入模块或对象失败
  • ModuleNotFoundError:找不到模块 (Python 3.6+)
2.2.7 与迭代和生成器相关
  • StopIteration:迭代器没有更多的值
  • GeneratorExit:生成器关闭时触发
2.2.8 与操作系统相关
  • OSError:操作系统错误,包含许多子类如:
    • FileExistsError:创建已存在的文件或目录
    • TimeoutError:操作超时
2.2.9 与断言相关
  • AssertionError:assert 语句失败
2.2.10 与多线程/多进程相关
  • RuntimeError:一般运行时错误
  • RecursionError:递归过深 (Python 3.5+)
  • NotImplementedError:抽象方法未实现

3. 异常处理最佳实践

3.1 基本异常处理结构

try:
    # 可能引发异常的代码
    risky_operation()
except SpecificError as e:
    # 处理特定异常
    print(f"发生特定错误: {e}")
except (ErrorType1, ErrorType2) as e:
    # 处理多种异常
    print(f"发生错误: {e}")
except Exception as e:
    # 处理所有其他异常
    print(f"发生未知错误: {e}")
else:
    # 没有异常时执行
    print("操作成功")
finally:
    # 无论是否发生异常都会执行
    print("清理操作")

3.2 异常处理建议

  1. 具体优于宽泛:先捕获具体异常,再捕获更一般的异常
  2. 不要静默所有异常:至少记录异常信息
  3. 合理使用 finally:释放资源等清理操作
  4. 自定义异常:为应用特定错误创建自定义异常类
  5. 异常链:Python 3 支持 raise ... from 保留原始异常

3.3 自定义异常示例

class MyAppError(Exception):
    """应用基础异常类"""
    pass

class InvalidInputError(MyAppError):
    """输入无效异常"""
    def __init__(self, input_value, message="无效输入"):
        self.input_value = input_value
        self.message = message
        super().__init__(f"{message}: {input_value}")

def process_input(value):
    if not value.isdigit():
        raise InvalidInputError(value)
    return int(value)

try:
    process_input("abc")
except InvalidInputError as e:
    print(f"错误: {e}, 输入值: {e.input_value}")

4. 常见错误排查技巧

  1. 阅读完整错误信息:Python 错误信息通常包含:

    • 错误类型
    • 错误描述
    • 错误发生的位置(文件和行号)
    • 调用栈跟踪(Traceback)
  2. 使用调试工具

    • print 调试
    • logging 模块
    • pdb 调试器
    • IDE 的调试功能
  3. 检查常见陷阱

    • 变量名拼写错误
    • 缩进问题
    • 导入循环
    • 可变默认参数
    • 整数除法(Python 2 和 3 不同)

更多学习资料

Python报错信息归类以及处理_第1张图片

你可能感兴趣的:(Python报错信息归类以及处理)