异常捕获:try-except

在 Python 编程中,异常捕获是一种用于处理程序运行时错误的机制。它通过 try-except 语句捕获异常,防止程序因错误中断,让程序能够继续执行或提供友好的错误提示。


1. 为什么需要异常捕获?

没有异常捕获时,程序遇到错误会直接崩溃。例如:

num = int(input("请输入一个数字:"))
print(10 / num)  # 如果输入 0,会抛出 ZeroDivisionError

如果用户输入了 0,程序会直接报错并退出:

ZeroDivisionError: division by zero

通过异常捕获,程序可以优雅地处理这个问题:

try:
    num = int(input("请输入一个数字:"))
    print(10 / num)
except ZeroDivisionError:
    print("错误:不能除以零!")

2. try-except 的基本结构

语法

try:
    # 可能会引发异常的代码
except 异常类型:
    # 异常发生时的处理代码

示例

try:
    result = 10 / 0
except ZeroDivisionError:
    print("错误:不能除以零!")

# 输出:
# 错误:不能除以零!

3. 捕获多个异常

当可能发生多种不同的异常时,可以为每种异常指定不同的处理逻辑。

语法

try:
    # 可能会引发多种异常的代码
except 异常类型1:
    # 处理异常类型1的代码
except 异常类型2:
    # 处理异常类型2的代码

示例

try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
except ValueError:
    print("错误:输入的不是数字!")
except ZeroDivisionError:
    print("错误:不能除以零!")

# 测试输入:
# 输入 "abc" 输出:错误:输入的不是数字!
# 输入 0 输出:错误:不能除以零!

4. 捕获所有异常

如果不确定可能会引发的异常类型,可以使用 Exception 捕获所有异常:

语法

try:
    # 可能会引发异常的代码
except Exception as e:
    # 处理所有异常
    print(f"发生错误:{e}")

示例

try:
    result = 10 / "a"
except Exception as e:
    print(f"发生错误:{e}")

# 输出:
# 发生错误:unsupported operand type(s) for /: 'int' and 'str'

⚠️ 注意:捕获所有异常可能掩盖问题,通常建议明确指定要捕获的异常类型。


5. elsefinally

else

  • try 块没有发生异常时执行。
  • 适合放置正常执行的代码。

finally

  • 无论是否发生异常,都会执行。
  • 通常用于清理资源(如关闭文件或释放锁)。

语法

try:
    # 可能会引发异常的代码
except 异常类型:
    # 异常处理代码
else:
    # 没有发生异常时的代码
finally:
    # 始终会执行的代码

示例

try:
    num = int(input("请输入一个数字:"))
    result = 10 / num
except ZeroDivisionError:
    print("错误:不能除以零!")
except ValueError:
    print("错误:输入无效!")
else:
    print(f"计算结果是:{result}")
finally:
    print("程序执行结束。")

# 测试输入:
# 输入 2 输出:
# 计算结果是:5.0
# 程序执行结束。
# 输入 0 输出:
# 错误:不能除以零!
# 程序执行结束。

6. 嵌套异常捕获

try-except 块可以嵌套使用,用于更复杂的错误处理逻辑。

示例

try:
    num = int(input("请输入一个数字:"))
    try:
        result = 10 / num
    except ZeroDivisionError:
        print("错误:不能除以零!")
    else:
        print(f"计算结果是:{result}")
except ValueError:
    print("错误:输入的不是数字!")

7. 捕获异常的常见错误

  1. 过度捕获异常 捕获所有异常可能掩盖潜在问题,应该尽量捕获特定的异常类型。

    try:
        risky_operation()
    except Exception:
        print("发生错误")
    

    改进:明确指定异常类型。

  2. 忽略异常处理 捕获异常后没有处理逻辑,可能让程序更难调试。

    try:
        risky_operation()
    except ValueError:
        pass  # 什么也不做
    

    改进:记录日志或提供有意义的提示。


8. 小结

  • try-except 是处理异常的核心工具。
  • 使用 else 块处理没有异常时的正常逻辑。
  • 使用 finally 块清理资源或完成善后工作。
  • 捕获异常时,尽量明确指定异常类型,避免过度捕获。

通过灵活使用异常捕获机制,可以提高程序的健壮性,让用户体验更加友好,同时方便开发者调试和维护代码。