文章目录
- 1.异常
- 2.错误
- 3.模块
- 4.包
- [综合练习]
1.异常
打开一个不存在的文件会引发异常
FileNotFoundError: [Errno 2] No such file or directory: ‘D:/不存在的文件.txt’
f=open(file="D:/不存在的文件.txt",mode="r", encoding='utf-8')
print(f.read())
(1)异常捕获
可以使用异常捕获,使程序正常执行
try:
f=open(file="D:/不存在的文件.txt",mode="r", encoding='utf-8')
except:
print("文件不存在") # 输出:文件不存在
捕获所有异常
法一
try:
1/0 # 可替换为其他异常
except:
print("捕获到了异常") # 捕获到了异常
法二
try:
1/0 # 可替换为其他异常
except Exception as x:
print(x) # division by zero
print("捕获到了异常") # 捕获到了异常
(2)捕获指定异常
异常的种类有很多,如 FileNotFoundError、NameError、ValueError、ZeroDivisionError
print(x) # NameError: name 'x' is not defined
a="str"
i=int(a) # ValueError: invalid literal for int() with base 10: 'str'
print(1/0) # ZeroDivisionError: division by zero
因此可以根据异常类型进行捕获
try:
print(x)
except NameError as y: # 定义任意变量y用于接收错误信息
print(y) # name 'x' is not defined
print("这是NameError异常") # 这是NameError异常
(3)多个except子句
一个 try 语句可能包含多个except子句,分别来处理不同的特定的异常。
如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略,即最多只有一个分支会被执行。
如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
以下程序只会输出:This is NameError
try:
print(x) # NameError: name 'x' is not defined(非输出)
a = "str"
i = int(a) # ValueError: invalid literal for int() with base 10: 'str'(非输出)
print(1 / 0) # ZeroDivisionError: division by zero(非输出)
except NameError as n:
print("This is NameError")
except ValueError as v:
print("This is ValueError")
except ZeroDivisionError as z:
print("This is ZeroDivisionError")
(4)raise抛出异常
可以使用raise在输出指定语句后继续抛出异常
若raise加在非第一个抛出的异常的except中,则不会抛出异常
抛出指定异常
x=5
if x>3:
raise Exception("引发了异常,x比3大了")
(5)同时处理多个异常
一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组。在try语句中,有一个满足元组内的异常就会执行except语句。
try:
print(1 / 0)
except (NameError,ValueError,ZeroDivisionError) as nvz:
print(nvz) # division by zero
print("NameError/ValueError/ZeroDivisionError") # NameError/ValueError/ZeroDivisionError
(6)try/except…else
else 必须放在所有的 except 子句之后
try:
print(1/0)
except:
print("引发了异常")
else:
print("继续执行")
# 输出: 引发了异常
try:
print(1/5)
except:
print("引发了异常")
else:
print("继续执行")
"""
0.2
继续执行
"""
(7)try-finally 语句
无论是否发生异常都要执行finally
(8)异常的传递性
在主函数中调用了f2,f2又调用了f1。在f1中引发了异常,返回f2,再返回主函数,我们可以在主函数位置处理异常(except),这就是异常的传递性
def f1():
print("this is f1")
num=1/0
print("f1 end")
def f2():
print("this is f2")
f1()
print("f2 end")
def main():
try:
f2()
except Exception as e:
print(e)
main() # 调用
"""
this is f2
this is f1
division by zero
"""
2.错误
错误一般指语法错误/解析错
如下是if语句没有加冒号的错误。语法分析器指出了出错的一行,并且在最先找到的错误的位置标记了一个箭头。
x=6
if x>5
print(1)
3.模块
(1)导入整个time模块,包含其中的全部方法
import time
time.sleep(5) # 程序暂停5秒
from time import *
sleep(5) # 程序暂停5秒
(2)仅导入time的sleep方法
from time import sleep
sleep(5) # 程序暂停5秒
(3)别名
import time as t
t.sleep(5) # 程序暂停5秒
from time import sleep as t2
t2(5) # 程序暂停5秒
(4)自定义模块
①如下是一个加法函数及调用
def add(a,b):
print(a+b)
add(2,3) # 5
可以将其改为模块
新建module文件
写入函数代码
在主函数中导入模块,即可使用
②当多个同名函数被调用时,后者会覆盖前者
调用module46的减法操作,输出:-1
③导入模块时会默认执行模块内容
输出:1
④导入模块时如果不希望执行模块部分内容
在模块内直接运行时会输出
而在被导入时不会输出任何内容
原理:在模块内运行时,当前模块视为main函数(即name=main),if判断成立,会执行print语句。当被导入时(相当于调用),name变为module45.py(而不再是main),if判断不成立,不会执行print的语句
⑤通过__all__控制import *
通过from module45 import * 可以调用module45.py中的所有的内容
但在module45.py中可以通过列表对 * 的访问进行限制,即重新说明 * 可访问的范围
[例]
module45.py
__all__ = ["f1"] # 只允许调用f1,f2访问不到
def f1():
print(1)
def f2():
print(2)
print(3)
if __name__ == "__main__":
print(4)
main.py
from module45 import *
f1()
f2()
(运行main时)输出:
3
1
首先输出3,在import导入时就会执行
if语句判断不成立,不会输出4
调用f1时属于all声明的内容,可以正常调用,输出1
调用f2时会有如下异常
4.包
包类似于文件夹,可以包含多个py文件
(选择Python软件包/Python Package)
(1)包的导入
在包中有一个加法操作
导入:import 包名.模块名
调用:包名.模块名.方法名
(2)使用from导入及调用
导入:from 包 import 模块
调用:模块.方法
from nihao import module
module.add(2,3) # 5
(3)指定功能导入
导入:from 包.模块 import 方法
调用:方法
from nihao.module import add
add(2,3) # 5
(4)使用all控制 *
(init文件时默认创建的,用来标识这个文件夹是一个包)
在init中使用all限制 *
这里只允许导入包中的module模块
*默认导入包中的全部模块
输出:
(5)第三方包
【安装方式一】
以安装numpy包为例
命令提示符输入
pip install numpy
如果下载速度过慢可尝试以下方法
导包没有安装提示视为安装成功
【安装方式二】
在PyCharm的设置中进行安装
如果安装速度慢可尝试以下方法
[综合练习]
[解]
str_util.py
def str_reverse(s):
return s[::-1]
def substr(s,x,y):
return s[x:y]
file_util.py
def print_file_info(file_name):
f=None
try:
f=open(file_name,"r",encoding="UTF-8")
except Exception as e:
print(f"文件不存在,异常原因为:{e}")
else:
print(f.read())
finally:
if f:
f.close() # 如果不要求使用finally,可以将close放到else中
def append_to_file(file_name,data):
f=open(file_name,"a",encoding="UTF-8")
f.write(data)
f.close() # close带有flush功能
main.py (任意测试数据)
from my_utils import str_util
from my_utils import file_util
print(str_util.str_reverse("hello"))
print(str_util.substr("hello",0,3))
file_util.print_file_info("D:/ceshi.txt")
file_util.append_to_file("D:/ceshi.txt","hehe")