【Python】异常处理

Python 的异常(Exceptions)是程序运行时发生的错误信号,用于处理程序中的非正常情况。通过异常机制,你可以优雅地捕获和处理错误,避免程序崩溃。


一、常见内置异常类型

表格

异常类型说明示例
SyntaxError语法错误(通常在解析阶段就报错,不属于运行时异常)print("hello"(缺少右括号)
NameError使用未定义的变量print(x)(x 未定义)
TypeError类型不匹配"a" + 1
ValueError值正确但类型不合适int("abc")
IndexError序列索引超出范围[1,2][5]
KeyError字典中找不到指定键d = {}; d['missing']
ZeroDivisionError除零错误1 / 0
FileNotFoundError文件未找到open('not_exist.txt')
AttributeError对象没有该属性"str".append()
ImportError导入模块失败import non_existent_module

所有异常都继承自BaseException,但用户自定义异常通常继承自Exception


二、异常处理:try...except

基本语法:

try: # 可能引发异常的代码 result = 10 / 0 except ZeroDivisionError: # 处理特定异常 print("不能除以零!")

处理多个异常

try: num = int(input("请输入一个数字: ")) result = 100 / num except ValueError: print("请输入有效的数字!") except ZeroDivisionError: print("不能输入零!") except Exception as e: # 处理所有其他异常 print(f"发生了未知错误: {e}")

完整的异常处理结构

def divide_numbers(x, y): try: result = x / y except ZeroDivisionError as e: print(f"除数不能为零: {e}") result = None except TypeError as e: print(f"类型错误: {e}") result = None else: # 只有在没有异常发生时执行 print("计算成功!") finally: # 无论是否发生异常都会执行 print("执行结束") return result # 测试 print(divide_numbers(10, 2)) # 正常 print(divide_numbers(10, 0)) # 除以零 print(divide_numbers(10, "2")) # 类型错误

自定义异常

# 创建自定义异常 class MyCustomError(Exception): """自定义异常类""" def __init__(self, message, error_code): super().__init__(message) self.error_code = error_code def __str__(self): return f"{self.args[0]} (错误代码: {self.error_code})" # 使用自定义异常 def validate_age(age): if age < 0: raise MyCustomError("年龄不能为负数", 1001) elif age > 150: raise MyCustomError("年龄超出合理范围", 1002) return True # 测试自定义异常 try: validate_age(-5) except MyCustomError as e: print(f"自定义错误: {e}, 代码: {e.error_code}")

三、主动抛出异常:raise

def divide(a, b): if b == 0: raise ValueError("除数不能为零!") return a / b # 调用 try: divide(10, 0) except ValueError as e: print(e) # 输出:除数不能为零!

最佳实践

  1. 不要空的 except:python
    # ❌ 不推荐 try: ... except: pass
    这会隐藏所有错误,包括系统退出(如KeyboardInterrupt)。
  2. 捕获具体异常,而不是笼统的Exception(除非必要)。
  3. 记录日志:在 except 块中使用logging模块记录错误信息。
  4. finally 用于资源清理:如关闭文件、数据库连接等。