一、异常的基本概念

1、什么是异常

分为编译异常和运行时异常。
编译异常:
代码缺少冒号、没有缩进,在编写时就会提示的错误。
运行时异常:
程序运行过程中出现的错误,会中断程序的正常执行流程。
例如:

num = int(input("请输入一个整数:"))
print(f"{num}是一个整数")

输入非整数:1.1
运行结果

2、异常处理的作用

防止程序直接崩溃: 程序遇到错误后,确保后面的代码正常执行。
区分异常类型: 捕获不同类型的异常,针对性处理。
便于调试: 打印错误信息,能够让我们更快的找到 bug。

二、异常处理的基本语法

1、核心语法:try…expect语句

try:
    # 可能会出错的代码
except 异常类型:
    # 出错之后要执行的代码

当然,我们也可以在输出具体的异常信息,代码如下。

try:
    # 可能会出错的代码
except 异常类型 as e:
    # 出错之后要执行的代码
    # as e 可以把捕获到的错误信息保存到变量 e 中
    print("出现错误:{e}")

2、多异常捕获

一段代码可能会出现多种类型的异常,可以用多个 except 语句进行处理。
分开捕获(最常用):每个异常单独进行处理。

try:
    num1 = int(input("请输入第一个数字:"))
    num2 = int(input("请输入第二个数字:"))
    count = num1 / num2
    print(f"结果是:{count}")
except ValueError:
    print(f"输入异常!请输入一个数字!")
except ZeroDivisionError:
    print(f"除数不能为0!")

合并捕获 :把异常写在元组里 (异常1, 异常2)。

try:
    num1 = int(input("请输入第一个数字:"))
    num2 = int(input("请输入第二个数字:"))
    count = num1 / num2
    print(f"结果是:{count}")
except (ValueError, ZeroDivisionError) as e:
    print(f"输入异常!请输入一个数字! 或 除数不能为0!{e}")

3、常见的异常类型

SyntaxError : 代码不符合 Python 语法,比如少写冒号、括号不匹配。

IndentationError : 缩进错误

NameError 名称错误: 访问了没定义的变量 / 函数名。

TypeError 类型错误: 操作 / 函数传入了不兼容的类型,比如字符串和数字相加。

IndexError 索引错误: 列表 / 字符串等序列的索引超出了范围。

KeyError 键错误: 在字典中访问了不存在的键。

ValueError 值错误: 传入的参数类型对,但值无效,比如把非数字字符串转成整数。

AttributeError 属性错误: 访问对象不存在的属性或方法。

ZeroDivisionError 除零错误: 除数为0

FileNotFoundError 文件未找到错误: 尝试打开一个不存在的文件。

ImportError 导入错误: 导入模块 / 包失败,比如模块路径错误或未安装。

KeyboardInterrupt 用户中断错误: 用户按Ctrl+C手动中断程序执行。

RuntimeError 运行时错误: 其他未明确分类的运行时错误,比如迭代器修改时的异常。

三、异常处理的扩展

1、else语句和finally语句

try+expect+else语句: 当try块中代码无异常时,才会执行else块中的内容;若有异常,else块会被跳过(不执行)。

try:
    num = int(input("请输入一个整数:"))
except ValueError as e:
    print(f"输入的不是整数!异常信息:{e}")
else:
    print(f"程序成功运行,{num}是一个整数")

没有异常的运行结果:
在这里插入图片描述
出现异常的运行结果:
在这里插入图片描述
try+expect+finally语句: 无论try块是否出现异常、except块是否执行,finally块中的内容都会被执行。常用于关闭文件、释放资源:

f = None
try:
    f = open("bak.txt", "r", encoding='utf-8')
    data = f.read()
    print(f"文件的内容为:{data}")
except FileNotFoundError:
    print("文件不存在")
finally:
    if f:
        f.close()
    print("文件已关闭")

正常运行结果:
在这里插入图片描述
出现异常的运行结果:
在这里插入图片描述

注意: else和finally语句可以同时使用,但else语句必须在expect语句之 后,fina语句之前

2、分级捕获

在Python的异常处理中,先捕获具体的子类异常,再捕获通用的父类异常。

子类异常: 范围小,知道具体的错误类型。

try:
    num1 = int(input("请输入第一个整数:"))
    num2 = int(input("请输入第二个整数:"))
    count = num1/num2
    print(f"结果是:{count}")
except ValueError:
    print("必须输入整数!")
except ZeroDivisionError:
    print("除数不能为0!")

运行示例:
在这里插入图片描述

父类异常: 范围广,能捕获所有子类异常,用来兜底。

try:
    num1 = int(input("请输入第一个整数:"))
    num2 = int(input("请输入第二个整数:"))
    count = num1/num2
    print(f"结果是:{count}")
except Exception as e:
    print(f"程序出现异常 异常信息:{e}")

错误输入的运行结果示例:

在这里插入图片描述
在这里插入图片描述

注意: 父类异常能捕获所有子类异常,可以同时使用,但父类异常必须在所有子类异常后使用。

错误示例: 父类异常在前,会直接覆盖子类异常,子类异常永远不会执行。

try:
    num1 = int(input("请输入第一个整数:"))
    num2 = int(input("请输入第二个整数:"))
    count = num1/num2
    print(f"结果是:{count}")
except Exception as e:
    print(f"程序出现异常 异常信息:{e}")
except ZeroDivisionError:
    print("除数不能为0!")

在这里插入图片描述

四、总结

  1. Python异常分语法错误和运行时异常,作用是防止程序崩溃、方便调试排错。
  2. 核心用try...except捕获异常,支持单独捕获、合并捕获,as e可查看错误详情。
  3. 熟记常见内置异常,对应不同代码报错场景。
  4. else无异常执行正常逻辑,finally无论是否报错都执行,用于释放资源。
  5. 异常有父子层级:子类精准具体,父类范围宽泛;分级捕获需先子类、后父类,避免顺序颠倒导致子类失效,让代码更健壮容错。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐