一、核心基础:异常是什么、有什么用

1. 异常是什么

异常是Python程序运行时出现的错误(如除零、索引越界),会中断程序执行,本质是程序运行时的“意外情况”,并非语法错误(语法错误是编写时的问题,无法运行)。

2. 异常有什么用

核心作用

具体说明(零基础易懂)

1. 避免程序崩溃

捕获异常后,程序不会因意外错误中断,可继续执行后续代码(比如用户输入错误,程序不闪退)。

2. 定位问题根源

异常会提示错误类型和位置,无需逐行排查,快速定位问题(如TypeError、IndexError,一眼知道错误原因)。

3. 提升程序健壮性

处理异常后,程序可应对各种意外情况(如输入非数字、文件不存在),更符合实际使用场景。

3.无异常处理 vs 有异常处理

# 1. 无异常处理:程序崩溃
a = 10
b = 0
print(a / b)  # 除零错误,程序中断,后续代码不执行
print("程序继续运行")

# 2. 有异常处理:程序正常执行
a = 10
b = 0
try:
    print(a / b)
except ZeroDivisionError:
    print("错误:除数不能为0")
print("程序继续运行")

二、深入核心:异常处理的核心用法

1. 异常处理四大关键字

关键字 作用 基本语法示例 是否必须 典型使用场景 注意事项
try 包裹可能发生异常的代码 try { 可能出错的代码 } 必须与 catchfinally 搭配使用 数据库操作、IO操作、网络请求等 不能单独存在,后面必须跟 catchfinally
catch 捕获并处理异常 catch (Exception e) { 处理代码 } 可选(但通常需要) 对异常进行日志记录、提示用户、恢复程序 可以有多个,子类异常要写在前面
finally 无论是否发生异常都会执行 finally { 必执行代码 } 可选 释放资源(关闭流、数据库连接等) 即使有 return 也会执行(特殊情况除外,如 JVM 退出)
throw 手动抛出异常对象 throw new Exception("错误信息"); 可选 自定义业务异常、参数校验失败 抛出的是“异常对象”

2. 核心用法代码演示

# 场景1:捕获单个异常
try:
    lst = [1, 2, 3]
    print(lst[5])  # 索引越界
except IndexError:
    print("错误:索引超出范围")

# 场景2:捕获多个异常(常用)
try:
    a = int(input("请输入数字:"))
    print(10 / a)
except (ValueError, ZeroDivisionError):
    print("错误:输入无效或除数为0")

# 场景3:try-except-else-finally 完整用法
try:
    f = open("test.txt", "r")
    content = f.read()
except FileNotFoundError:
    print("错误:文件不存在")
else:
    print("文件内容:", content)
finally:
    f.close()  # 无论是否出错,都关闭文件
    print("文件已关闭")

三、常用异常类型

异常类型

触发场景

ZeroDivisionError

除数为0(如10 / 0)

IndexError

索引超出容器范围(如lst[5],lst长度为3)

ValueError

数据类型正确但值无效(如int("abc"))

TypeError

数据类型错误(如10 + "abc")

FileNotFoundError

打开不存在的文件(如open("test.txt", "r"))

四、深入拓展:主动抛出异常与自定义异常

1. 主动抛出异常(raise关键字)

# 主动抛出指定异常
def check_age(age):
    if age < 0 or age > 120:
        raise ValueError("年龄必须在0-120之间")
    print(f"年龄:{age}")

check_age(150)  # 主动抛出异常,中断程序
# 结合try-except捕获
try:
    check_age(150)
except ValueError as e:
    print(e)  # 打印异常信息

2. 自定义异常(继承Exception类)

# 自定义异常类
class MyError(Exception):
    pass

# 使用自定义异常
try:
    score = int(input("请输入成绩:"))
    if score < 0 or score > 100:
        raise MyError("成绩必须在0-100之间")
except MyError as e:
    print(e)
else:
    print(f"成绩:{score}")

五、注意点

  • except 后不指定异常类型,会捕获所有异常(不推荐,无法精准定位问题)。

  • 多个except时,子类异常(如ZeroDivisionError)要放在父类异常(如Exception)前面,否则子类异常不会被捕获。

  • finally 内的代码无论是否有异常都会执行,常用于释放资源(如关闭文件、数据库连接)。

  • 异常处理不是越多越好,只捕获可能出现的异常,避免过度捕获(冗余)。

Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐