Python学习笔记·第16天:让程序不再崩溃——异常处理与模块化编程
·
一、异常机制
1. 什么是异常?
异常就是程序运行过程中遇到的错误情况。比如:除数为0、文件不存在、内存不足等。Python通过异常类来描述和处理这些异常。
处理过程:
- 抛出异常:发生异常时,生成一个异常对象,停止当前执行路径
- 捕获异常:解释器寻找相应的代码来处理该异常
# 最常见的异常:除数不能为0
a = 3 / 0 # ZeroDivisionError
2. try…except 结构(最基础)
try:
被监控的可能引发异常的语句块
except BaseException [as e]:
异常处理语句块
执行顺序:
- try块中没有异常 → 跳过except,继续执行后续代码
- try块中发生异常 → 跳过try块中后续代码,跳到except块处理异常,然后继续执行后续代码
try:
print("step1")
a = 3 / 0
print("step2") # 这行不会执行
except BaseException as e:
print("step3")
print(e)
print("step4")
# 输出:step1 → step3 → 异常信息 → step4
3. try…多个except结构
按先子类后父类的顺序捕获多个异常,最后可以用BaseException兜底。
try:
被监控的语句块
except Exception1:
处理Exception1
except Exception2:
处理Exception2
except BaseException:
处理可能遗漏的异常
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a) / float(b)
print("结果是:", c)
except ZeroDivisionError:
print("除数不能为0")
except BaseException as e:
print("出错了,错误是", e)
4. try…except…else 结构
- try块无异常 → 执行else块
- try块有异常 → 执行except块,不执行else块
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a) / float(b)
except BaseException as e:
print("出错了,错误是", e)
else:
print("结果是:", c) # 无异常时才执行
5. try…except…finally 结构
finally块无论是否发生异常都会执行,通常用来释放资源。
try:
a = input('请输入被除数:')
b = input('请输入除数:')
c = float(a) / float(b)
except BaseException as e:
print("出错了,错误是", e)
else:
print("结果是:", c)
finally:
print("我是finally,无论发生异常,都执行")
6. 自定义异常类
自定义异常通常继承Exception类,命名以Error为后缀,由raise语句主动抛出。
# 自定义异常类
class AgeError(Exception): # 继承Exception
def __init__(self, errorInfo):
Exception.__init__(self)
self.errorInfo = errorInfo
def __str__(self):
return str(self.errorInfo) + ",年龄错误"
if __name__ == "__main__":
age = int(input("请输入一个年龄:"))
if age < 1 or age > 150:
raise AgeError(age)
else:
print("正常年龄")
二、异常处理核心总结
| 结构 | 执行逻辑 | 使用场景 |
|---|---|---|
try...except |
有异常执行except | 最基本的异常捕获 |
try...多个except |
匹配到哪个异常执行哪个 | 针对不同异常做不同处理 |
try...except...else |
无异常才执行else | 需要区分“正常结果”和“异常处理” |
try...except...finally |
finally一定执行 | 需要释放资源(如关闭文件) |
raise |
主动抛出异常 | 业务逻辑校验不通过时 |
三、模块
1. 什么是模块?
模块就是一个包含Python代码的.py文件,可以包含函数、类、变量以及可执行代码。模块化编程能提高代码的可维护性和重用性。
使用模块的原因:
- 提高代码可维护性
- 避免命名冲突
- 增加代码复用率
- 逻辑组织更清晰
2. 导入模块的方式
| 导入方式 | 语法 | 使用方式 |
|---|---|---|
| 导入整个模块 | import 模块名 |
模块名.功能名() |
| 导入多个模块 | import 模块1, 模块2 |
同上 |
| 导入指定功能 | from 模块 import 函数/类/变量 |
直接使用功能名 |
| 导入所有功能 | from 模块 import * |
直接使用功能名 |
| 给模块起别名 | import 模块 as 别名 |
别名.功能名() |
| 给功能起别名 | from 模块 import 功能 as 别名 |
直接使用别名 |
代码演示:
# 方式1:导入整个模块
import math
print(math.sqrt(25)) # 5.0
# 方式2:导入指定功能
from math import sqrt, pi
print(sqrt(25)) # 5.0
print(pi) # 3.14159...
# 方式3:导入所有功能
from math import *
print(sqrt(25))
# 方式4:给模块起别名
import math as m
print(m.sqrt(25))
# 方式5:给功能起别名
from math import sqrt as my_sqrt, pi as pai
print(my_sqrt(25))
print(pai)
3. 自定义模块
自定义模块就是自己写的.py文件,供其他程序导入使用。
两个关键变量:
| 变量 | 作用 | 值 |
|---|---|---|
__name__ |
判断模块是被执行还是被导入 | 直接执行时为'__main__',被导入时为模块名 |
__all__ |
控制from 模块 import *时哪些功能被导入 |
一个字符串列表 |
# moduleA.py
__all__ = ['add'] # 只允许导出add函数
def add(num):
return num + 1
def add2(num):
return num + 10
if __name__ == '__main__':
print("这个模块被直接执行了")
# main.py
from moduleA import *
print(add(1)) # 可以调用
# print(add2(1)) # 报错!add2没有被导出
注意:import 模块方式导入不受__all__影响,可以调用模块中的所有功能。
4. 包(Package)
包就是一个包含多个模块的文件夹,必须包含一个__init__.py文件。
导入方式:
| 方式 | 语法 | 使用 |
|---|---|---|
| 导入包的模块 | import 包名.模块 |
包名.模块.功能() |
| 从包导入模块 | from 包名 import 模块 |
模块.功能() |
| 从包的模块导入功能 | from 包名.模块 import 功能 |
直接调用功能 |
# 目录结构:
# my_package/
# __init__.py
# moduleA.py
# moduleB.py
# 方式1
import my_package.moduleA
print(my_package.moduleA.add(1))
# 方式2
from my_package import moduleA
print(moduleA.add(1))
# 方式3
from my_package.moduleA import add
print(add(1))
__init__.py中的__all__:控制from 包 import *时哪些模块被导入。
# my_package/__init__.py
__all__ = ['moduleB']
# main.py
from my_package import *
moduleB.add(1) # 可以调用
# moduleA.add(1) # 报错,moduleA没有被导出
多层级的包:通过.来确认层级关系。
# my_package/inner_package/moduleC.py
import my_package.inner_package.moduleC
my_package.inner_package.moduleC.hi()
# 或者
from my_package.inner_package import moduleC
moduleC.hi()
5. pip 模块下载
pip是Python的包管理工具,用于安装、卸载和管理第三方包。
| 指令 | 作用 |
|---|---|
pip --version |
查看pip版本 |
pip list |
查看已安装的包 |
pip install 包名 |
安装单个包 |
pip install 包1 包2 |
安装多个包 |
pip uninstall 包名 |
卸载包 |
pip install -r requirements.txt |
通过配置文件批量安装 |
pip install 包名 -i 镜像网址 |
使用国内镜像加速安装 |
常用镜像网址:
- 清华:
https://pypi.tuna.tsinghua.edu.cn/simple/ - 阿里云:
https://mirrors.aliyun.com/pypi/simple/
示例:
pip install pygame -i https://pypi.tuna.tsinghua.edu.cn/simple/
今日核心总结
-
异常处理:
- 核心结构:
try...except...else...finally except捕获异常,else无异常时执行,finally一定执行- 自定义异常继承
Exception类,用raise主动抛出 - 捕获多个异常时按子类优先、父类兜底的顺序
- 核心结构:
-
模块:
- 模块就是
.py文件,包就是包含__init__.py的文件夹 - 导入方式:
import 模块、from 模块 import 功能、import 模块 as 别名 __name__判断模块是被执行还是被导入__all__控制from 模块 import *导出的内容- pip是Python的包管理工具,用国内镜像加速下载
- 模块就是
-
组织结构层次:
函数 → 类 → 模块(.py文件) → 包(文件夹) → 项目
注:已经使用DeepSeek进行整理精简核心内容,些许不理解的配合个人笔记进行理解。
目前已经开始用已经学习的知识开始制作图书馆里系统啦,今天因为家里有事情耽误啦,只学习两节,不然python基础今天学完啦嘿嘿
更多推荐



所有评论(0)