异常处理

一、错误与异常

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)

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐