在 Python 编程中,错误是不可避免的。无论是输入错误、文件不存在,还是除以零等问题,程序运行时都可能发生异常(Exception)。 如果不处理这些异常,程序会直接崩溃,导致用户体验和系统稳定性下降。 因此,掌握异常处理机制,是编写健壮 Python 程序的重要一环。
一、什么是异常(Exception)
异常指程序运行过程中出现的错误。 与语法错误不同,异常是在程序运行时触发的错误。
例如:
            
            
              python
              
              
            
          
          print(10 / 0)
        执行结果:
            
            
              vbnet
              
              
            
          
          ZeroDivisionError: division by zero
        这说明 Python 检测到了"除以零"的错误并抛出了一个异常对象。
二、常见的异常类型
Python 内置了多种异常类型,常见的有以下几类:
| 异常类型 | 说明 | 
|---|---|
ZeroDivisionError | 
除以零时发生 | 
TypeError | 
类型不匹配 | 
ValueError | 
无效的数值参数 | 
IndexError | 
索引越界 | 
KeyError | 
字典中查找不存在的键 | 
FileNotFoundError | 
打开的文件不存在 | 
AttributeError | 
调用不存在的属性或方法 | 
NameError | 
使用未定义的变量 | 
IOError | 
输入输出错误 | 
ImportError | 
导入模块失败 | 
RuntimeError | 
一般性的运行时错误 | 
示例:
            
            
              python
              
              
            
          
          lst = [1, 2, 3]
print(lst[5])  # IndexError
        三、捕获异常 try...except
为了防止异常导致程序崩溃,我们可以使用 try...except 块捕获并处理异常。
            
            
              python
              
              
            
          
          try:
    x = int(input("请输入一个数字:"))
    y = 10 / x
    print("结果:", y)
except ZeroDivisionError:
    print("错误:除数不能为零!")
except ValueError:
    print("错误:请输入有效的数字!")
        运行效果:
请输入一个数字:0
错误:除数不能为零!
        ✅ 程序不会崩溃,能够优雅地处理异常。
四、同时捕获多个异常
当你想同时处理多种异常类型时,可以把它们放在同一个 except 中:
            
            
              python
              
              
            
          
          try:
    num = int("abc")
except (TypeError, ValueError):
    print("类型或值错误!")
        五、获取异常信息
有时我们需要查看异常的具体信息,可以用 as 关键字:
            
            
              python
              
              
            
          
          try:
    result = 10 / 0
except ZeroDivisionError as e:
    print("发生异常:", e)
        输出:
            
            
              csharp
              
              
            
          
          发生异常: division by zero
        六、finally:无论是否出错都执行
finally 块常用于释放资源,例如关闭文件、断开网络连接等。
            
            
              python
              
              
            
          
          try:
    f = open("data.txt", "r")
    content = f.read()
except FileNotFoundError:
    print("文件不存在!")
finally:
    print("无论是否出错,都会执行这里")
        输出:
文件不存在!
无论是否出错,都会执行这里
        ✅ 即使出现异常,finally 中的代码也一定会执行。
七、else:没有异常时执行
try 块中代码正常执行时,可以进入 else 块。
            
            
              python
              
              
            
          
          try:
    x = 5
    y = 2
    print(x / y)
except ZeroDivisionError:
    print("除数不能为零!")
else:
    print("没有异常,成功执行!")
finally:
    print("程序结束。")
        输出:
2.5
没有异常,成功执行!
程序结束。
        八、抛出自定义异常
有时我们希望主动抛出异常,用于提示特定错误,可以使用 raise。
            
            
              python
              
              
            
          
          def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("余额不足!")
    balance -= amount
    return balance
try:
    withdraw(100, 200)
except ValueError as e:
    print("异常提示:", e)
        输出:
异常提示: 余额不足!
        ✅ 这种方式常用于输入验证、接口返回检查等场景。
九、自定义异常类
如果内置异常不够表达业务语义,可以创建自定义异常类:
            
            
              python
              
              
            
          
          class InsufficientFundsError(Exception):
    def __init__(self, balance, amount):
        self.balance = balance
        self.amount = amount
        super().__init__(f"余额不足,当前余额 {balance},取款 {amount}")
try:
    raise InsufficientFundsError(100, 300)
except InsufficientFundsError as e:
    print("捕获到自定义异常:", e)
        输出:
捕获到自定义异常: 余额不足,当前余额 100,取款 300
        十、总结
| 关键字 | 作用 | 
|---|---|
try | 
包含可能出错的代码 | 
except | 
捕获并处理异常 | 
else | 
没有异常时执行 | 
finally | 
无论是否异常都执行 | 
raise | 
主动抛出异常 | 
异常处理的本质是:
让程序从"出错崩溃"变为"可控应对",从而提升健壮性与可靠性。