异常处理
一、错误与异常
1、错误:
语法错误(大小写拼写错误、括号不匹配等…)=> 不能正常执行
逻辑错误(程序运行正常,只是最后结果不符合预期)
2、异常:
程序运行过程中,出现的意料之外的错误
如:打开的文件不存在、被除数为0、操作的数据类型不对、存储错误,互联网请求错 误…
二、常见的异常类
1、NameError–》变量名异常:尝试访问一个没有申明的变量
2、ZeroDivisionError–》除数为0的异常
3、SyntaxError–》语法错误
4、IndexError–》索引异常:索引超出序列范围
5、KeyError–》关键字异常:请求一个不存在的字典关键字
a = {'a':1}
print(a['b']) --> a.get('b')没有找到不会抛出异常
6、IOError–》读写异常:例如:读取的文件不存在
7、AttributeError–》属性异常:尝试访问未知的对象属性
8、ValueError–》类型异常:传给函数的参数类型不正确,例如:给int()函数里面传入了字符串
9、AssertionError–》断言异常,常用在测试,例如函数的执行结果不符合预测的结果
三、异常处理
1、异常机制:try…except
异常发生,不终止程序
异常发生,做特殊处理
2、捕获异常,如果捕获到了异常就处理except里的内容
正常执行: try -> 执行代码 -> 结束
遇到异常: try -> 遇到异常 -> 跳到excep -> 结束
try:
print('打开文件aa')
fp = open('aa')
except:
print('文件未找到')
print('end.....')
3、except可以有多个分支,匹配到第一个异常就会退出
except捕获的错误与触发的错误不一致,程序就捕获不到,异常就会照常抛出
4、父异常与子异常:父类异常放在前面,会吞噬所有的子类异常
例如:
老师(父类)–》高中老师,初中老师,培训老师–》文老师
Exception --》 FileNotFoundError --》 open(‘aa’)
因此一般我们会把父异常放到最后面
try:
print('打开文件aa')
fp = open('aa')
# print(1/0)
except ZeroDivisionError as ze:
print("除数为0")
except FileNotFoundError as fe:
print("文件未找到")
except Exception as e:
print(f'exception:{e}')
print('end.....')
5、else结构:没有任何异常发生的时候执行的
try:
print('else....')
print(1/0)
except:
print('error')
else:
print('else end')
6、finally结构:不管有没有异常,不管异常有没有被捕获都执行
try:
print('finally....')
# print(1/0)
except ZeroDivisionError:
print('error')
else:
print('else end')
finally:
print('finally test end.....')
finally子句很强大,即使有函数的return语句也要执行finally
def finally_func():
try:
print('try..test')
return 'abc'
except :
print('error')
finally:
print('finally test end.....')
result = finally_func()
print(result)
7、手动触发异常
raise – 默认就抛出RuntimeError
raise 异常类 --》raise IndexError
raise 异常类(‘异常信息’) --》raise IndexError(‘index error’)
try:
scout = int (input("请输入学生的成绩,范围是0-100:"))
if scout<0 or scout>100:
raise IndexError('你输入的范围有误')
else:
print(f'这个学生的成绩是{scout}')
except ValueError as va:
print('你输入的不是整型')
except IndexError as fe:
print('你输入的范围有误')
8、局域网存活IP检测
#!/usr/bin/python3
import subprocess
import IPy
subprocess.call('>down.txt',shell=True)
subprocess.call('>up.txt',shell=True)
ip = IPy.IP('192.168.243.0/24')
# 循环得到192.168.243.0/24网段的IP清单,然后一个ip发一个ping包,查看返回值是否ping通
for x in ip:
rc = subprocess.call(
'ping %s -c 1 &> /dev/null' %x,
shell=True
)
# 定义ping命令的变量,返回值0:正常,返回值1:ping不通
if rc:
# 没ping通的ip写入down.txt
subprocess.call('echo %s 没有被使用 >>down.txt' %x,shell=True)
else:
# ping通的ip写入up.txt
subprocess.call('echo %s 已经被使用 >>up.txt' %x,shell=True)