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)
集合推导式
主要就是去重用的

浙公网安备 33010602011771号