joeの小窝

Loading...

python基础09异常和推导式

一、异常的基本概念

什么是异常

异常是程序执行过程中发生的非预期事件,会中断程序的正常流程

  • 访问不存在的变量

  • 打开不存在的文件

print(10/0)

# 直接报错
# ZeroDivisionError: division by zero

会返回一个异常对象(包含错误类型,描述信息,发生位置)

  File "D:\pydaima\pystudy\异常\异常1.py", line 1, in <module>
    print(10/0)
          ~~^~
ZeroDivisionError: division by zero

代码文件,第一行,异常类型这些

常见的内置异常类型

异常类型 触发场景 示例
NameError 访问未定义的变量 print(x)(x 未定义)
TypeError 操作或函数应用于错误类型的对象 "2" + 2(字符串与整数相加)
ValueError 函数接收到的参数值合法但不符合要求 int("abc")(字符串无法转为整数)
ZeroDivisionError 除数为零 10 / 0
IndexError 序列索引超出范围 [1,2,3][5]
KeyError 字典中查找不存在的键 {"a":1}["b"]
FileNotFoundError 打开不存在的文件 open("nonexist.txt")
PermissionError 没有操作文件/目录的权限 open("/root/file.txt")(无权限)
UnicodeDecodeError 文本解码失败(如用 UTF-8 解码 GBK 文件) open("gbk.txt", encoding="utf-8").read()
AttributeError 访问对象不存在的属性 "abc".foo()(字符串无 foo 方法)

二、异常处理核心语法

用try-except语句捕获异常

try:   # 可能触发异常的代码块
    print(10/0)
except Exception as e:  # 捕获异常,上面的try发生了异常就执行
    print(e)
else:  # 无异常执行,有异常不执行,可选的
    print("没有异常发生执行")

finally:  # 无论是否有异常都执行
    print("无论是否有异常都执行")

捕获指定异常

捕获并处理

try:
    result = 10/0
    print("计算结果",result)  # 异常发生后,此行不会被执行
except ZeroDivisionError:  # 触发异常
    print("错误,除数不能为0")


获取异常信息:as e 捕获异常对象

通过 as e 获取异常对象,提取错误详情

try:
    result = 10/0
    print("计算结果",result)
except ZeroDivisionError as e:
    print(e)

# 输出为division by zero

捕获多个异常

try后面可以接多个except,处理不同类型的异常

try:
    result = 10/0
    print("计算结果",result)
except ZeroDivisionError as e:
    print(e)
except NameError:
    print("变量没有定义")

捕获所有异常(Exception)

Exception 是所有异常的父类

try:
    result = 10/0
    print("计算结果",result)

except Exception as e:
    print(e)

三、异常的主动触发与传递

主动触发异常:raise语句

就是人为触发一个异常

raise 异常类型(提示信息)

raise 异常类型("异常提示信息")
age = -5
if age < 0:
    raise ValueError("年龄不能为负数")

# 输出信息
# ValueError: 年龄不能为负数

raise 不带参数

捕获异常后,若无法处理,可通过 raise 重新抛出,让上层代码处理

try:
    1 / 0
except ZeroDivisionError:
    print("捕获到除零错误")
    raise  # 重新抛出异常,上层代码可以继续捕获,抛出捕获的异常

# 输出信息
捕获到除零错误
Traceback (most recent call last):
  File "D:\pydaima\pystudy\异常\异常1.py", line 28, in <module>
    1 / 0
    ~~^~~
ZeroDivisionError: division by zero

推导式学习

推导式本质就是for循环

列表推导式

# 后面的变量赋值给最前面的变量i
l1 = [i for i in range(10)]
print(l1)

l2 = [i for i in range(10) if i%2 ==0]
print(l2)

字典推导式

合并2个列表

键值对的方式

l1 = ["name","age"]
l2 = ["tom",19]

dict1 = {l1[i]:l2[i] for i in range(len(l1))}
print(dict1)

集合推导式

主要就是去重用的

posted @ 2026-05-19 17:07  乔的港口  阅读(0)  评论(0)    收藏  举报