python 错误与异常
语法错误与定位
错误
# 错误
# 语法错误
num = 1
if num > 1 # 缺少冒号
print("num>1") # 结构是: SyntaxError: expected ':' line 4第四行
# 逻辑错误
if num >=1:
print("num<=1") # 实现结果与实际场景逻辑不对
elif num>100:
print("num<100") # 实现结果与实际场景逻辑不对
# 系统错误
# 如运行是内存泄露、系统错误等引起的运行失败
异常
- 程序执行过程中出现的未知错误
- 语法和逻辑都是正常的
- 程序业务逻辑不完善引起的程序漏洞–bug
错误与异常的区别
- 异常可以被捕获和处理
- 错误一般是编码错误、逻辑错误、系统错误
常见的异常类型
# 除零异常
def div(a,b):
return a/b
print(div(1, 0)) # 异常是:ZeroDivisionError: division by zero
# 名称异常
# num =1
if numb >1:
num =2 # 异常是:NameError: name 'numb' is not defined. Did you mean: 'num'?
# 索引异常
list = [1,2,3]
print(list[4]) # 异常是:ZeroDivisionError: division by zero
# 键异常
dict1 = {"name":"wlll","age":18}
print(dict1['sex']) # 异常是:KeyError: 'sex'
# 值异常
a = input("请输入一个值:")
print(int(a)) # 输入不是数字后,异常是:ValueError: invalid literal for int() with base 10: 'a'
# 属性异常
# 更新一些常量属性时会抛出的异常
异常/错误处理流程
- 如果是拼写、配置等引起的错误,根据出错信息排查出现的位置进行解决
- 如果是程序设计不完善引起的漏洞,根据漏洞的情况进行设计处理漏洞的逻辑
异常捕获、异常处理
def div(a, b):
return a % b
try:
print(div(1, 1)) # 正确显示0
except Exception as e:
print('此处有异常', e) # 没有异常不显示,有异常显示异常
else:
print("哈哈,没有异常") # 没有异常则打印
finally: # 无论是否有异常后还会执行此处
print('finally') # 结果是 finally
使用raise抛出异常
def aum(num):
if num <=0 or num >=100:
raise ValueError(f"值错误:{num}")
else:
print(f"设置的年龄为:{num}")
print(aum(-1)) # 主动抛出异常:ValueError: 值错误:-1
print(aum(80)) # 结果是: 设置的年龄为:80
自定义异常
class MyException(Exception):
def __init__(self, value):
self.value = value
print(f'这是一个异常:{value}')
def __str__(self):
return repr(self.value)
def aum(num):
if num <=0 or num >=100:
raise MyException(f"值错误:{num}")
else:
print(f"设置的年龄为:{num}")
aum(-55) # 异常抛出:MyException: '值错误:-55'