Skip to content

第14章:异常处理

14.1 异常的概念

异常是程序运行时出现的错误,如语法错误、索引错误、文件不存在错误等,这些错误会导致程序崩溃。异常处理是一种机制,用于捕获和处理这些错误,使程序能够继续运行,而不是直接崩溃。

  • 异常的类型
    • 语法错误:代码语法不正确,在编译时就会被发现
    • 运行时错误:代码语法正确,但在运行时出现错误,如除以零、访问不存在的索引等
    • 逻辑错误:代码语法正确,运行时也不报错,但结果不符合预期

14.2 异常处理的作用

异常处理的主要作用包括:

  • 避免程序崩溃:捕获异常后,程序可以继续执行,而不是直接终止
  • 提供错误信息:可以向用户显示友好的错误信息,而不是晦涩的错误堆栈
  • 资源清理:确保无论是否发生异常,资源都能被正确释放
  • 提高程序健壮性:使程序能够处理各种异常情况,提高用户体验

14.3 异常处理语法

基础语法

python
try:
    # 可能出现异常的代码
    代码1
    代码2
    ...
except 异常类型:
    # 异常处理代码
    代码1
    代码2
    ...

捕获所有异常

python
try:
    # 可能出现异常的代码
except Exception:
    # 捕获所有未指定的异常
    print("发生了异常")

多异常捕获

python
try:
    # 可能出现异常的代码
except (异常类型1, 异常类型2):
    # 捕获多种指定异常
    print("发生了指定的异常")

finally语句

finally语句无论是否出现异常,都会执行,通常用于关闭文件、释放资源等操作。

python
try:
    # 可能出现异常的代码
except Exception:
    # 异常处理代码
finally:
    # 无论是否出现异常,都会执行的代码
    print("清理资源")

else语句

else语句在没有出现异常时执行。

python
try:
    # 可能出现异常的代码
except Exception:
    # 异常处理代码
else:
    # 没有出现异常时执行的代码
    print("执行成功")

14.4 常见异常类型

Python中有许多内置的异常类型,以下是一些常见的异常类型:

异常类型描述
IndexError索引越界异常
KeyError字典访问不存在的键异常
FileNotFoundError文件不存在异常
ValueError值错误
TypeError类型错误
ZeroDivisionError除以零异常
AttributeError属性错误
NameError名称错误
SyntaxError语法错误

实操案例:捕获文件不存在异常

案例:捕获文件不存在异常

python
def read_file(filename):
    """读取文件内容,捕获文件不存在异常"""
    try:
        with open(filename, "r", encoding="utf-8") as f:
            content = f.read()
            print(f"文件内容:\n{content}")
    except FileNotFoundError:
        print(f"错误:文件{filename}不存在!")
    except Exception as e:
        print(f"错误:{e}")
    finally:
        print("文件操作完成")

# 测试
read_file("test.txt")  # 假设文件不存在
read_file("existing_file.txt")  # 假设文件存在

运行结果

错误:文件test.txt不存在!
文件操作完成
文件内容:
Hello, Python!
Welcome to exception handling.
文件操作完成

实操案例:捕获索引越界异常

案例:捕获索引越界异常

python
def get_element(lst, index):
    """获取列表元素,捕获索引越界异常"""
    try:
        element = lst[index]
        print(f"索引{index}处的元素是:{element}")
        return element
    except IndexError:
        print(f"错误:索引{index}超出列表范围!")
        return None

# 测试
numbers = [1, 2, 3, 4, 5]
get_element(numbers, 2)  # 正常访问
get_element(numbers, 10)  # 索引越界
get_element(numbers, -6)  # 负索引越界

运行结果

索引2处的元素是:3
错误:索引10超出列表范围!
错误:索引-6超出列表范围!

实操案例:捕获用户输入错误异常

案例:捕获用户输入错误异常

python
def get_age():
    """获取用户年龄,捕获输入错误异常"""
    while True:
        try:
            age = int(input("请输入你的年龄:"))
            if age < 0 or age > 150:
                raise ValueError("年龄必须在0-150之间")
            print(f"你今年{age}岁")
            return age
        except ValueError as e:
            print(f"输入错误:{e}")
            print("请重新输入")

# 测试
age = get_age()
print(f"获取到的年龄:{age}")

运行结果

请输入你的年龄:abc
输入错误:invalid literal for int() with base 10: 'abc'
请重新输入
请输入你的年龄:200
输入错误:年龄必须在0-150之间
请重新输入
请输入你的年龄:25
你今年25岁
获取到的年龄:25

新手易错点

  • 捕获异常过于宽泛

    • 不指定具体异常类型,使用except Exception:捕获所有异常
    • 这会掩盖真正的错误原因,不利于调试
    • 建议只捕获预期的异常类型
  • finally语句使用错误

    • 在finally语句中使用return语句,会覆盖try或except中的return值
    • finally语句应该只用于清理资源,不应该包含业务逻辑
  • 未处理关键异常

    • 忽略异常处理,导致程序在遇到异常时直接崩溃
    • 应该捕获并处理可能出现的异常,提高程序的健壮性
  • 异常处理嵌套过深

    • 多层嵌套的try-except语句,使代码难以阅读和维护
    • 应该合理设计代码结构,减少异常处理的嵌套层次

通过本章的学习,你已经掌握了Python中异常处理的基本方法。异常处理是Python编程中的重要内容,它可以帮助你编写更加健壮的程序,提高用户体验。在实际编程中,你应该合理使用异常处理,捕获和处理可能出现的异常,同时避免过度使用异常处理影响代码的可读性和性能。

© 2026 编程马·菜鸟教程 版权所有