文章目录
9.1 了解异常
1、什么是异常
当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”,也就是我们常说的BUG。
2、bug单词的诞生
3、异常演示
9.2 异常的捕获方法
1、为什么要捕获异常
- 世界上没有完美的程序,任何程序在运行的过程中,都有可能出现异常,也就是出现bug,导致程序无法完美运行下去。
- 我们要做的不是力求程序完美运行,而是在力所能及的范围内,对可能出现的bug,进行提前准备、提前处理。这种行为我们称之为:
异常处理(捕获异常)
。 - 程序遇到bug,接下来有两种情况,1、整个程序因为一个bug停止运行,2、对bug进行提醒,整个程序继续运行。在真实工作中,我们肯定不能因为一个小的bug就让整个程序全部崩溃,此时就需要使用到捕获异常。
捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段。
2、捕获常规异常
try:
f = open("D:/123.txt", "r", encoding="UTF-8")
except:
print("出现异常了,我执行的是异常处理代码")
f = open("D:/123.txt", "w", encoding="UTF-8")
3、捕获指定异常
try:
print(name)
except NameError as e:
print("出现异常了,我执行的是异常处理代码")
print(e)
运行结果:
4、捕获多个异常
try:
print(1 / 0)
except (ZeroDivisionError, NameError) as e:
print("出现异常了,我执行的是异常处理代码")
print(e)
运行结果:
5、捕获异常并输出描述信息
6、捕获所有异常
try:
print(name)
except Exception as e:
print("出现异常了,我执行的是异常处理代码")
print(e)
运行结果:
7、异常else
try:
print("hello,world")
except Exception as e:
print("出现异常了,我执行的是异常处理代码")
print(e)
else:
print("hello,黑马程序员")
运行结果:
8、异常的finally
try:
f = open("D:/789.txt", "r", encoding="UTF-8")
except Exception as e:
print("出现异常了,我执行的是异常处理代码")
f = open("D:/789.txt", "w", encoding="UTF-8")
else:
print("hello,黑马程序员")
finally:
print("开始执行finally了")
f.close()
运行结果:
9.3 异常的传递性
异常是具有传递性的,当函数func01中发生异常,并且没有捕获处理这个异常的时候,异常会传递到函数func02,当函数func02也没有捕获处理这个异常的时候,main函数会捕获这个异常,这就是异常的传递性。
提示:当所有函数都没有捕获异常的时候,程序就会报错
。
def func01():
print("这是func01开始")
num = 1 / 0
print("这是func01结束")
def func02():
print("这是func02开始")
func01()
print("这是func02结束")
def main():
try:
func02()
except Exception as e:
print(e)
main()
运行结果:
利用异常具有传递性的特点,当我们想要保证程序不会因为异常崩溃的时候,就可以在main函数中设置异常捕获,由于无论在整个程序中哪里发生异常,最终都会传递到main函数,这样就可以确保所有的异常都会被捕获。
9.4 Python模块
1、什么是模块
Python模块(Module),是一个Python文件,以.py结尾。模块能定义函数,类和变量,模块里也能包含可执行的代码。
2、模块的导入方式
- import 模块名
import time
print("你好")
time.sleep(5)
print("我好")
- from 模块名 import 功能名
from time import sleep
print("你好")
sleep(5)
print("我好")
- from 模块名 import *
from time import *
print("你好")
sleep(5)
print("我好")
- as定义别名
# 模块定义别名
import time as t
print("你好")
t.sleep(5)
print("我好")
# 功能定义别名
from time import sleep as s
print("你好")
s(5)
print("我好")
3、自定义模块
4、测试模块
运行my_module1.py,输出2
运行my_module2.py,输出30,若my_module1.py中不加if语句,则my_module2.py的运行会输出2 30。
注意事项:当导入多个模块的时候,且模块内有同名功能,当调用同名功能的时候,调用到的是后面导入的模块的功能。
5、all变量
9.5 Python包
1、什么是Python包
2、导入包
- 方式一
import my_package.my_module1
import my_package.my_module2
my_package.my_module1.info_print1()
my_package.my_module2.info_print2()
- 方式二
注意:必须在__init__.py文件中添加__all__ = [],控制允许导入的模块列表。
from my_package import *
# my_module1.info_print1() # my_module1不在__all__控制的模块列表
my_module2.info_print2()
3、什么是第三方包
4、安装第三方包-pip
5、pip的网络优化
6、安装第三方包-PyCharm
下载时为了提高速度可以在第三个页面勾选上Options并写上 -i http://pypi.tuna.tsinghua.edu.cn/symple。
9.6 综合案例
def str_verse(s):
"""
反转字符串
:param s: 待反转的字符串
:return: 反转完成的字符串
"""
return s[::-1]
def substr(s, x, y):
"""
字符串切片
:param s: 进行切片的字符串
:param x: 起始下标
:param y: 结束下标
:return: 切片得到的字符串
"""
return s[x:y]
def print_file_info(file_name):
"""
打印文件内容
:param file_name: 文件路径
:return: None
"""
f = None
try:
f = open(file_name, "r", encoding="UTF-8")
content = f.read()
print("文件的内容如下:")
print(content)
except Exception as e:
print(f"出现异常了:{e}")
finally:
if f:
f.close()
def append_to_file(file_name, data):
"""
在文件后追加内容
:param file_name: 文件路经
:param data: 要追加的内容
:return: None
"""
f = open(file_name, "a", encoding="UTF-8")
f.write(data)
f.write("\n")
f.close()
import my_utils.str_util
from my_utils import file_util
print(my_utils.str_util.str_verse("itheima"))
print(my_utils.str_util.substr("itheima", 2, 4))
file_util.append_to_file("D:/测试.txt", "黑马程序员")
file_util.print_file_info("D:/测试.txt")
运行结果: