16异常处理
异常处理
异常
- 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
- 一般情况下,在Python无法正常处理程序时就会发生一个异常。
- 异常是Python对象,表示一个错误。
- 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
捕获异常
异常类型捕获
# 捕获常规异常
try:
可能发生错误的代码
except:
如果出行异常执行的代码
# 捕获指定异常
try:
可能发生错误的代码
except NameError as e: # e = 当前异常对象
如果出行异常执行的代码
# 捕获多个异常
try:
可能发生错误的代码
except(NameError, ZeroDisvisionError):
如果出行异常执行的代码
# 捕获全部异常(捕获常规异常也可以)
try:
可能发生错误的代码
except Exception as e: # e = 当前异常对象
如果出行异常执行的代码
常见异常类型
异常名称 | 描述 |
---|---|
AttributeError | 对象没有这个属性 |
OSError | 操作系统错误 |
ImportError | 导入模块/对象失败 |
IndexError | 序列中没有此索引(index) |
KeyError | 没有这个键 |
NameError | 未声明/初始化对象 (没有属性) |
SyntaxError | Python 语法错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
Warning | 警告的基类 |
try-except-else
- 如果抛出异常执行except内部代码
- 如果程序正常执行else内部代码
# else异常
try:
print(1)
except Exception as e:
print(e)
else:
print("我是else,是没有异常的时候执行的代码")
try-except-finally
不管程序有无发生异常,都将执行finally内部代码。
# 异常的Finally(无论是否有异常,都要执行的代码)
try:
f = open("test.txt",'r')
except Exception as e:
f = open("test.txt",'w')
else:
print("未出现异常")
finally:
f.close()
注意:else和Finally可写可不写
主动触发异常
- 在实际开发中,在程序不满足某条件时,通常会主动抛出异常。
- 语法:raise Exception()
# 判断煎饼熟了没,当烹饪时间小于5时,则主动触发没熟异常;否则熟了。
def test(level):
if level<5:
raise Exception("没熟没熟")
try:
test(4)
except Exception as e:
print(e)
else:
print("熟了 请吃")
自定义异常
- 当需要自定义满足一些规则时,就可以自定义异常。
- 自定义异常通过创建一个新的异常类,自定义名字与内容,并且需要继承Exception类实现。
# 判断密码长度 如果密码长度小于6 主动触发异常 并抛出异常信息(打印提示)
class ShortInputError(Exception):
# 初始化方法
def __init__(self, lenght, min_lenght):
self.lenght = lenght
self.min_lenght = min_lenght
def __str__(self):
return f"你输入的密码长度为{self.lenght},不能低于{self.min_lenght}"
def fun():
try:
password = input("请输入你的密码:")
if len(password) < 6:
raise ShortInputError(len(password), 6) # 主动触发异常 并返回提示信息
except Exception as e:
print(e)
else:
print("密码已正确输入!")
fun()
断言
- assert断言用于判断一个表达式,当表达式条件为False时触发断言异常AssertionError。
- 注意:断言用于强制用户服从,可捕获,但是一般不捕获。
- 语法:assert 表达式,返回数据
print("*" * 20)
if 2 == 2:
raise AssertionError
print("*" * 20)
"""
print("*" * 20)该语句并不会执行,条件满足,触发了断言,后面的语句都不会再执行
"""
print("*" * 20)
if 2 == 2:
# 捕获断言
try:
raise AssertionError
except Exception as e:
# 类的对象实例调用__class__属性时会指向该实例对应的类,而后再调用 __name__ 就会输出该实例对应的类的类名
print(e.__class__.__name__)
print("*" * 20)
try:
n = input("请输入一个数字:")
assert n.isdigit(), "只能输入数字" # assert 表达式,返回数据
print("你输入的是:", n)
except Exception as ex:
print("发现错误:", ex)
"""
请输入一个数字:s
发现错误: 只能输入数字
"""
本文来自博客园,作者:大-锅,转载请注明原文链接:https://www.cnblogs.com/daguo118/p/17355676.html