异常处理
1.异常
运行程序的时候程序报错,又叫程序出现异常
当执行程序的时候如果出现异常,出现异常的线程会崩溃,不会再执行该线程中后面的其它代码
list1 = [1, 2, 3]
# print(list1[10]) # IndexError: list index out of range
2.异常捕获
1)语法1:
try:
代码块1
except:
代码块2
其它语句
说明:
try、except - 关键字,固定写法
代码块1 - 和try保持缩进的一条或者多条语句(需要捕获异常的代码)
代码块2 - 和except保持一个缩进的一条或者多条语句(异常发生后会执行的代码)
执行过程:
先执行代码块1,如果在执行代码块1的时候出现了异常,程序不崩溃,直接执行代码块2,然后
在执行其他语句;如果在执行代码块1的时候没有出现异常,代码块2不会执行,直接执行其他语句
try:
list1 = [1, 2, 3]
print(list1[10])
except:
print('出现异常')
print('============')
name = input('姓名:')
try:
age = int(input('年龄:'))
except:
print('输入有误!年龄为数字!')
2)语法2:捕获指定异常
try:
代码块1
except 异常类型:
代码块2
执行过程:
先执行代码块1,如果执行代码块1的时候出现异常,检查异常类型和except
后面的异常类型是否一致,如果一致该线程不崩溃,直接执行代码块2;如果不一致,该线程崩溃
如果没有出现异常,不执行代码块2,直接执行其他代码
try:
list1 = [1, 2, 3]
print(list1[10])
print({'a': 1}['b'])
print('-----------')
except KeyError:
print('key值错误')
3)语法3:捕获指定的多个异常
try:
代码块1
except (异常类型1,异常类型2,....):
代码块2
其他语句
4)语法4:同时捕获指定的多个异常,并对不同的异常有不同的处理
try:
代码块1
except 异常类型1:
代码块11
except 异常类型2:
代码块22
3.finally关键字
前面四种捕获异常的结构里面都可以在最后加上:
finally:
代码块
finally 后面的代码块不管在什么情况下都会执行
4.抛出异常
主动让程序崩溃
语法:
raise 异常类型
说明:异常类型必须是Exception的子类
# raise ValueError
class AgeError(Exception):
def __str__(self):
return '年龄范围不在0-120之间'
age =1000
if not 0 <= age <= 150:
raise AgeError
模块
1.什么是模块
python中一个.py文件就是一个模块
2.怎么在一个模块中使用另外一个模块中的内容
如果要在一个模块中去使用另外一个模块中的内容,必须先导入模块
1)语法
1.import 模块名(py文件名)
导入指定模块,导入后可以在当前模块中使用导入模块所在的文件里的所有全局变量
使用导入模块的全局变量:
‘模块名.全局变量’
# 在文件test.py中写入一个全局变量 a = 100,和 f1函数打印"test"
import test
print(test.a) # 100
test.f1() # test
2.from 模块名 import 变量名1,变量名2....
导入指定模块中的指定变量,导入后只能使用所导入的变量
(导入后的指定变量可以在当前模块中直接使用,不用加 "变量名." )
from test import a , f1
print(a) # 100
f1() # test1
f2() #NameError: name 'f2' is not defined
3.from 模块名 import *
导入指定模块,导入后可以在当前模块中使用导入模块所在的文件里的所有全局变量
(导入后的指定变量可以在当前模块中直接使用,不用加 "变量名." )
from test import *
print(a) # 100
f1() # test1
f2() # test2
4.重命名
a.对模块重命名:
import 模块名 as 重命名的模块名
导入后采用重命名后的模块名去使用模块中的内容
b.form 模块名 import 变量名1 as 新变量名1, 变量名2, 变量名3 as 新变量名3
导入后采用重命名后的变量名去使用导入模块中的变量
import fileManager
fileManager.as_num()
fileManager.das_aad()
# =====================
import fileManager as FM
FM.das_aad()
FM.as_num()
3.导入模块的原理
当执行导入模块的代码,会直接执行被导入模块中所有的代码
1)重复导入问题
import 在导入模块的时候会自动检查这个模块之前是否已经到如果,来避免一个模块的重复导入
2)阻止模块中的内容被其他模块导入
将不需要被其他模块执行的语句写入“if name == 'main':”对应的if语句中
import test
import test
# 100
# test1
# test2
# 只执行一个
if __name__ == '__main__':
pass
# 当文件在执行时,__name__ == ('__main__')
# 文件未执行时, __name__ == ('文件名')
# 所以在文件执行时会直接执行 if 下面的语句
# 当文件调用时 __name__ == ('文件名'),所以调用的模块不会执行
包
1.什么是包
一个带有init.py文件的文件夹
1.直接导入包 - 只执行init.py里面的内容
import animal # __init__
2.从包中导入指定模块
from animal import cat
# __init__
# 爬树
3.从包的指定模块导入指定变量
from animal.cat import c
print(c)
# __init__
# 爬树
# 100