目录
一、了解异常
二、异常的捕获方法
1、为什么捕获异常:
2、如何捕获异常
3、异常--else 表示如果没有异常要执行的代码编辑
4、异常--finally 表示无论如何都要执行的代码,例如关闭文件
三、异常的传递
四、Python --模块
1、什么是模块:
2、模块的导入方式:
3、自定义模块
五、Python包
1、自定义包
2、安装第三方包
六、综合案例
什么是异常:
当我们检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误提示,这就是所谓的“异常”,也就是我们常说的bug
bug来源:
底层程序有问题,运行时候将异常信息提示出来
没有完美的程序,在任何程序运行都有可能出现异常,就是出现bug导致程序无法完美的运行下去。
我们不能百分百保证程序完美,但是可以对可能出现的bug进行提前准备、提前处理。即就是--异常处理(捕获异常)
当程序遇到bug,会有以下两种情况:
1)整个程序因为一个bug停止运行
2)对bug进行提醒,整个程序继续运行
一般遇到bug就是出现1)的情况,此时整个程序崩溃。但是实际情况不能因为一个bug导致程序全部崩溃,此时可以通过捕获异常来解决。
捕获异常作用:提前假设某处会出现异常,做好提前准备,当异常真正出现的时候,可以有后续手段。
(1)捕获常规异常:
基本语法:
入门案例:
需求:尝试以'r'模式打开文件,如果文件不存在,则以'w'方式打开
# 基本捕获语法
try:
f = open("D:/Test/error.txt", 'r', encoding='UTF-8') # 读取一个不存在的文件,运行出现异常FileNotFoundError
except:
print("出现异常,因为文件不存在。我将open模式由r--w")
f = open("D:/Test/error.txt", 'w', encoding='UTF-8')
(2)捕获指定异常:
基本语法:
注意事项:
如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
一般try下方只放一行尝试执行的代码
(3)捕获多个异常
当捕获多个异常时,可以把要捕获的异常类型的名字,放到except后面,并使用元组的方式书写
(4)捕获所有异常
except Exception as e: 等同于 except:
# 基本捕获语法
try:
f = open("D:/Test/error.txt", 'r', encoding='UTF-8') # 读取一个不存在的文件,运行出现异常FileNotFoundError
except:
print("出现异常,因为文件不存在。我将open模式由r--w")
f = open("D:/Test/error.txt", 'w', encoding='UTF-8')
try:
f = open("D:/Test/fin.txt",'r',encoding='UTF-8')
except Exception as e:
print("出现异常了",e)
f = open("D:/Test/fin.txt",'w',encoding='UTF-8')
else:
print("没有异常继续执行")
finally:
print("在finally,有没有异常都要执行,一般用于最后关闭资源")
f.close()
异常是具有传递性的
当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当func02也没有捕获处理这个异常的时候,main函数会捕获这个异常。
注意:当所有函数都没有捕获异常的时候,程序就会报错
"""
演示异常的传递性
"""
# 定义一个出现异常的方法-函数
def func01():
print("func01开始执行")
num = 1 / 0 # 有异常
print("func01结束执行")
# 定义一个没有异常的方法 调用上面的方法
def func02():
print("func02开始执行")
func01()
print("func02结束执行")
# 定义一个方法调用第二个没有异常的方法
def main():
func02()
main()
在main()中处理异常
Python 模块(module),是一个Python文件,以 .py结尾,模块能定义函数,类和变量,模块里也能包含可执行的代码。
模块作用:Python中的各种不同的模块,每一个模块都可以帮助我们快速的实现一些功能。例如实现时间相关的功能就使用time模块。可以将模块看作一个工具包。每个工具包都有各种不同的工具供我们使用进而实现各种不同的功能。
总之:模块就是一个Python文件,里面包含类。函数、变量等。可以直接拿来用(导入模块使用)
模块在使用前需要导入。导入语法:
[from 模块名] import [模块| 类| 变量| 函数| *] [as 别名]
常用的组合形式:
"""
演示模块导入
"""
import time # 使用import 导入time模块使用sleep()功能
print("暂停5秒后开始")
time.sleep(5) # 通过 模块. 就可以使用模块内部的全部功能
print("开始")
# 使用from导入time的sleep 只用其中的一个功能
from time import sleep
print("暂停5秒后开始")
sleep(5)
print("开始")
# 使用 * 导入time模块的全部功能
from time import *
print("暂停5秒后开始")
sleep(5)
print("开始")
# 使用as给特定功能加上别名
import time as t
print("暂停5秒后开始")
t.sleep(5)
print("开始")
from time import sleep as sl
print("暂停5秒后开始")
sl(5)
print("开始")
模块一般都在代码开头的位置
Python中已经帮我们实现了许多模块,不过有时候我们需要一些个性化模块需要自定义模块。
注意:每个python文件都快与作为一个模块;模块的名字就是文件的名字。即自定义模块名必须要符合标识符命名规则。
(1)如何自定义模块并使用
将完成的模块内容写入一个Python文件中,使用的时候通过模块导入方法导入即可。
注意:当导入多个模块的时候,且模块内部有同名功能--调用该功能,调用到的是后面导入的模块的功能。
# 定义一个简单的函数 作为自定义模块--演示自定义模块导入
def test(a,b):
print(a+b)
# 定义一个和test同名的函数 --演示自定义模块导入同名功能
def test(a,b):
print(a-b)
(2)了解_main_变量的作用
背景:在实际开发中,开发人员自行在.py文件中添加测试信息调用功能,但是其他已经导入了该模块的文件在运行时都会执行调用的功能 例如:在my_module1.py文件中添加测试代码:
问题:如何只在当前模块中调用该函数。
def test(a,b):
print(a+b)
# 只在当前模块中调用该函数
if __name__ == '__main__':
test(1, 3)
(3)__all__
如果一个模块文件中有'__all__' ,当使用 feom xxx import * 导入是,只能导入这个列表中的元素
注意:只作用于 from 模块 import *
__all__ = ['test_B']
def test_A(a,b):
print(a - b)
def test_B(a,b):
print(a + b)
从物理上看,包就是文件夹,在该文件下包含了一个__init__.py文件,该文件夹可用于包含多个模块文件
从逻辑上看,包的本质依旧是模块
包的作用:
当我们的模块文件越来越多时,包可以帮助我们管理这些模块,包的作用就是包含多个模块,但其本质依旧是模块
new -- Python Package 创建包默认生成__init__.py文件表示该文件夹是python的包,而非普通的文件夹。
"""
演示在包中自定义模块
"""
def info_print1():
print("模块1的功能函数")
引用-- import 包.模块 其他类比模块导入
注意:在创建包时生成的__init__.py文件中添加__all__ = [](列表类型)可以控制允许导入的模块列表,只针对 from ... import *这种方式有效
(1)什么是第三方包
在Python程序生态中,有许多的第三方包--非Python内置包,但是可以极大的提高开发的效率,常见的如:
由于没有内置 需要先下载安装才可以导入使用
(2)安装第三方包
使用pip命令来安装:在命令提示符输入 pip install 包名称
在pycharm中下载
创建一个自定义包,名称为:my_utils
在包内提供两个模块,实现:
代码实现
"""
模块实现字符串相关工具:
"""
def str_reverse(s):
"""
接受传入的字符串,将字符串反转返回
:param s:
:return:
"""
restr = s[::-1]
return restr
def substr(s,x,y):
"""
按照下标x,y对字符串进行切片
:param s:
:param x:
:param y:
:return:
"""
restr = s[x:y]
return restr
if __name__ == '__main__':
str = '春天的熊bera'
print(str_reverse(str))
print(substr(str,0,1))
"""
自定义模块实现文件处理功能
"""
def print_file_info(file_name):
"""
接收文件传入的路径,打印文件的全部内容,如文件不存在则捕获异常,输出提示信息,通过finally关闭文件对象
:param file_name:
:return:
"""
f = None
try:
f = open(file_name, 'r', encoding='UTF-8')
content = f.read()
print(content)
except Exception as e:
print("文件出现异常:",e)
finally: # 假如文件内容不存在,则f内容为空,不再是文件类型,使用f.close()会报错 需要加个判断
if f: # 如果f是None表示False f有内容则是True
f.close()
def append_to_file(file_name,data):
"""
接收文件路径以及传入数据,将数据追加写入到文件中
:param file_name:
:param data:
:return:
"""
f = open(f"{file_name}", 'a', encoding='UTF-8')
f.write(data)
f.write('\n')
f.close()
if __name__ == '__main__':
# print_file_info("D:/Test/bill.txtw")
append_to_file('D:/Test/apend.txt',"ff")