Python异常、模块、包
一、异常
1、定义
当检测到一个错误时,Python解释器就无法继续执行了,反而出现了一些错误的提示,这就是所谓的“异常”, 也就是我们常说的BUG
2、捕获异常
(1)捕获常规异常
代码示例
# 捕获常规异常 try: f = open('F:/abc.txt', 'r', encoding='Utf-8') except: print('出现异常了,将改为w模式') f = open('F:/abc.txt', 'w', encoding='Utf-8')
(2)捕获指定异常
- 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
- 一般try下方只放一行尝试执行的代码
代码示例
# 捕获指定异常 try: print(name) except NameError as e: print('出现变量未定义异常') print(e) # name 'name' is not defined
(3)捕获多个异常
输出异常信息
代码示例
# 捕获多个异常,并输出异常信息 try: # print(name) print(1 / 0) except (NameError, ZeroDivisionError) as e: print('出现变量未定义或除以0异常')
(4)捕获全部异常
代码示例
# 捕获全部异常 try: print(name) print(1 / 0) except Exception as e: print('出现异常')
(5)异常 else
else表示的是如果没有异常要执行的代码。
代码示例
# 异常的else try: print('hello') except Exception as e: print('出现异常') else: print('没有异常 嘿嘿')
(6)异常的 finally
finally表示的是无论是否异常都要执行的代码,例如关闭文件。
代码示例
# finally语法 try: f = open('F:/abc.txt', 'r', encoding='Utf-8') except Exception as e: print('出现异常') f = open('F:/abc.txt', 'w', encoding='Utf-8') else: print('没有异常 嘿嘿') finally: print('有没有异常 我都执行') f.close()
3、异常的传递
当函数func1中发生异常, 并且没有捕获处理这个异常的时候, 异常会传递到函数func2, 当func2也没有捕获处理这个异常的时候,main函数会捕获这个异常, 这就是异常的传递性.
# 调用一个有异常的方法 def func1(): print('func1开始执行') num = 1 / 0 print('func1结束执行') # 定义一个无异常的方法调用上面的异常 def func2(): print('func2开始执行') func1() print('func2结束执行') # 定义个方法,调用上面方法 def main(): try: func2() except: print("main结束执行") main()
利用异常具有传递性的特点, 当我们想要保证程序不会因为异常崩溃的时候,就可以在main函数中设置异常捕获, 由于无论在整个程序哪里发生异常, 最终都会传递到main函数中, 这样就可以确保所有的异常都会被捕获
二、模块
1、定义
模块就是一个Python文件,里面有类、函数、变量等,我们可以拿过来用(导入模块去使用)
2、模块导入的方式
常用的组合形式如:
- import 模块名
# 通过import导入time使用sleep功能(time中的所有功能都能用) import time print('你好') time.sleep(3) # 通过 。 就可以使用模块内部的全部功能 print('我好')
- from 模块名 import 类、变量、方法等
# 使用from导入time功能(只能用sleep) from time import sleep print('你好') sleep(3) print('我好')
- from 模块名 import *
# 使用 * 导入所有功能 from time import * print('你好') sleep(3) print('我好')
- as 定义别名
# 使用 as 给模块加上别名 import time as t print('你好') t.sleep(3) print('我好') # 使用 as 给功能加上别名 from time import sleep as sl print('你好') sl(3) print('我好')
3、自定义模块
代码示例
python异常模块与包.py
# 自定义模块 # 引用自定义模块my_module1 import my_module1 my_module1.test(1, 2) # 3 # 或 from my_module1 import test from my_module2 import test # 都有test时,后一个会覆盖前一个调用,pycharm中会高亮显示调用的语句 test(2, 3) # -1
my_module1.py
def test_a(a, b): print(a + b)
my_module2.py
def test(a, b): print(a - b)
4、测试模块
代码示例
python异常模块与包.py
# 测试模块 # __main__变量 from my_module1 import test_a # 直接输出3 # __all__变量 列表,可以手动指定导入哪个模块 from my_module1 import * # 只能用test_a
my_module1.py
# all作用在 * 上 __all__ = ["test_a"] def test_a(a, b): print(a + b) def test_b(a, b): print(a - b) # 右键运行可以执行 if __name__ == '__main__': test_a(1, 2)
- 当导入多个模块的时候,且模块内有同名功能. 当调用这个同名功能的时候,调用到的是后面导入的模块的功能
- 如果一个模块文件中有`__all__`变量,当使用`from xxx import *`导入时,只能导入这个列表中的元素
- if __name__ == “__main__”表示,只有当程序是直接执行的才会进入if内部,如果是被导入的,则if无法进入
三、包
1、自定义包
包的作用:
当我们的模块文件越来越多时,包可以帮助我们管理这些模块, 包的作用就是包含多个模块,但包的本质依然是模块新建包后,包内部会自动创建`__init__.py`文件,这个文件控制着包的导入行为
代码示例
① 新建包`my_package`
② 新建包内模块:`my_module1` 和 `my_module2`
③ 模块内代码如下
my_module1.py
def info_print1(): print('我是模块1')
my_module2.py
def info_print2(): print('我是模块2')
导入包
# 自定义python包 # 创建一个包 # 导入自定义包中的模块,并使用 import my_package.my_module1 my_package.my_module1.info_print1() # 我是模块1 from my_package import my_module2 my_module2.info_print2() # 我是模块2 # 导入具体的功能 from my_package.my_module1 import info_print1 info_print1() # 我是模块1 # 通过all变量控制import * from my_package import * my_module1.info_print1() # 我是模块1 my_module2.info_print2() # name 'my_module2' is not defined
2、安装Python包
(1)打开命令提示符程序,输入 pip install 包名称
(2)使用国内镜像,可参考之前的文章
四、综合案例
练习题
代码示例
file_util.py
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: # 如果变量是None,就是False,有内容是True 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() if __name__ == '__main__': print_file_info('F:/学习资料/Python/黑马/资料/aaa.txt') append_to_file('F:/学习资料/Python/黑马/资料/aaa.txt', 'CSDN')
str_util.py
def str_reverse(s): """ 功能是将字符串完成反转 :param s: 将被反转的字符串 :return: 反转后的字符串 """ return s[::-1] def substr(s, x, y): """ 功能是按照给定字符串的下标,完成给定字符串的切片 :param s: 即将被切片的字符串 :param x: 切片的开始下标 :param y: 切片的结束下标 :return: 切片完成后的字符串 """ return s[x:y] if __name__ == '__main__': print(str_reverse('欢迎来到CSDN')) print(substr('欢迎来到CSDN', 1, 3))
Python异常模块与包.py
import my_utils.str_util from my_utils import file_util print(my_utils.str_util.str_reverse('CSDN')) # NDSC print(my_utils.str_util.substr('CSDN', 0, 4)) # CSDN file_util.print_file_info('F:/学习资料/Python/黑马/资料/aaa.txt') file_util.append_to_file('F:/学习资料/Python/黑马/资料/aaa.txt', 'CSDN')