一、了解异常
异常的概念
什么是异常
当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的"异常",也就是我们常说的BUG。
二、异常的捕获
1.知道为什么要捕获异常
世界上没有完美的程序,任何程序在运行的过程中,都有可能出现:异常,也就是bug导致程序无法完美的运行下去。
我们要做的,不是力求程序完美运行。
而是在力所能及的范围内,对可能出现的bug,进行提前准备,提前处理。
这种行为我盟称之为:异常处理(捕获异常)
当我们的程序遇到了BUG,那么接下来有两种情况
1.整个程序因为一个BUG停止运行
2.对BUG进行提醒,整个程序继续运行
显然在之前的学习中,我们所有的程序遇到BUG就会出现1的这种情况,也就是整个程序直接奔溃
但是在真实工作中,我们肯定不能因为一个小的BUG就让整个程序全部崩溃,也就是我们希望达到的是2的这种情况,那这里我们就需要使用到捕获异常
捕获异常的作用在于:提前假设摸处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段
2.掌握异常的语法格式
基本语法:
try:
可能发生错误的代码
except:
如果出现异常执行的代码
快速入门
需求:尝试以'r'模式打开文件,如果文件不存在,则以'w'方式打开
try:
f = open('linux.txt','r')
except:
f = open('linux.txt','w')
捕获指定异常
基本语法:
try:
print(name)
except NameError as e:
print('name变量名称未定义错误')
1.如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
2.一般try下方只放一行尝试执行的代码
捕获多个异常
当捕获多个异常是,可以要捕获的异常类型的名字,放到except后,并使用元组的方式进行书写
try:
print(1/0)
except(NameError,ZeroDivisionError):
print('ZeroDivision错误。。。。')
执行结果:
异常else
else表示的是如果没有异常要执行的代码
try:
print(1)
except Exception as a:
print(e)
else
print('我是else,是没有异常的时候执行的代码')
finally表示的是无论是否异常都要执行的代码,例如关闭文件
try:
f = open('test.txt','r')
except Exception as e:
f = open('test.txt','w')
else:
print("没有异常,真开心")
finally:
f.close()
总结演示
"""
演示异常捕获
"""
# 基本捕获语法
try:
f = open("D:/abc.txt","r",encoding="UTF-8")
except:
print("出现异常了,因为文件不存在,我将open的模式,改为w模式打开")
f = open("D:/abc.txt","w",encoding="UTF-8")
# 捕获指定的异常
try:
print(name)
# 1 / 0
except NameError as e:
print("出现了变量未定义的异常")
print(e)
# 捕获多个异常
try:
1 / 0
print(name)
except (NameError,ZeroDivisionError) as e:
print("出现了变量未定义 或者 除以0的异常错误")
# 未正确设置捕获异常类型,将无法捕获异常
# 捕获所有异常
try:
f = open("D:/123.txt","r")
except Exception as e:
print("出现异常了")
f = open("D:/123.txt","w",encoding="UTF-8")
else:
print("好高兴,没有异常")
finally:
print("我是finally,有没有异常我都要执行")
f.close()
三、异常的传递
异常是具有传递性的
当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当func也没有捕获处理这个异常的时候main函数会捕获这个异常,这就是异常的传递性
提示:
当所有函数都没有捕获异常的时候,程序就会报错
# 定义一个无异常的方法,调用上面的方法
def func2():
print("func2 开始执行")
func1()
print("func2 结束执行")
# 定义一个方法,调用上面的方法
def main():
try:
func2()
except Exception as e:
print(f"出现异常了,异常的信息是:{e}")
main()
四、Python模块
1.模块的导入
了解什么是模块
python模块(Module),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块的作用:python中有很多各种不同的模块,每一个模块都可以帮助我们快速实现一些功能,比如实现和时间相关的功能就可以使用time模块,我们可以认为一个模块就是一个工具包,每一个工具包中都有各种不同的工具供我们使用进而实现各种不同的功能
大白话:模块就是一个Python文件,里面有类、函数、变量等,我可以拿过来用(导入模块去使用)
掌握导入Python内置的模块
模块在使用前需要先导入 导入的语法如下
"""
演示Pyhton的模块导入
"""
# 使用import导入time模块使用sleep功能(函数)
import time # 导入Python内置的time模块(time.py这个代码文件)
print("你好")
time.sleep(5) # 通过。就可以使用模块内部的全部功能(类、函数、变量)
print("我好")
# 使用from导入time的sleep功能(函数)
from time import sleep # *表示全部的意思
print("你好")
sleep(5)
print("我好")
# 使用 * 导入time模块的全部功能
from time import *
print("你好")
sleep(5)
print("我好")
# 使用as给特定功能加上别名
import time as t
print("你好")
t.sleep(5)
print("我好")
from time import sleep as sl
2.自定义模块
制作自定义模块
Python中已经帮我们实现了很多的模块,不过有时候我们需要一些个性化的模块,这里就可以通过自定义模块实现,也就是自己制作一个模块
案例:新建一个Python文件,命名为my_modulel.py,并定义test函数
注意:
每个Python文件都可以作为一个模块,自定义模块的名字必须符合规范
all
如果一个模块文件中有_all_变量,当使用from xxx import * 导入时,只能导入这个列表中的元素
"""
演示自定义模块
"""
# 导入自定义模块使用
import my_module1
from my_module1 import test
test(1,2)
my_module1.test(1, 2)
# 导入不同模块的同名功能
from my_module1 import test
from my_module2 import test
test(1,2)
# __main__变量
from my_module1 import test
# __all__变量
from my_module1 import *
__all__ = ["test_2"]
def test_2(a,b):
print(a - b)
def test_1(a, b):
print(a - b)
五、Python包
1.自定义包
什么是python包
从物理上看,包就是一个文件夹,在该文件夹下包含了一个_init_.py文件,该文件夹可用于包含多个模块文件,从逻辑上看,包的本质依然是模块
包的作用:
当我们的模块文件越来越多时,包可以帮助我们管理这些模块,包的作用就是包含 多个模块,但报的本质依然是模块