异常机制
异常机制
异常和错误的区别?
异常:不正常的事件,需要预防和处理;
错误:单词拼写错误,不符合语法规则就是错误
# 对数字进行转型
num = int(input("请输入一个数字:"))
"""
如果输入的是数字,可以直接转型
如果输入的是非数字,则会报错
例如输入:英文字母
报错类型:ValueError:括号里的数不是十进制的数
这就是异常
"""
格式:用try:把有可能出现异常的代码包裹起来,后面写except:,下面写如果出现异常就执行的程序
try:
num = int(input("请输入一个数字:"))
except:
print("如果出现异常,则执行这里的代码···")
"""
输出结果:
请输入一个数字:ui
如果出现异常,则执行这里的代码···
"""
升级:当程序出现异常的时候,如何获取异常的错误信息;
捕获具体的异常
ValueError异常
try:
num = int(input("请输入一个数字:"))
except ValueError:
print("如果这里的代码执行了,就说明是ValueError")
"""
输出结果:
请输入一个数字:;危机感 <----异常位置
如果这里的代码执行了,就说明是ValueError
"""
ZeroDivisionError异常
try:
num = int(input("请输入一个数字:"))
print(num/0) # <----异常位置
except ValueError:
print("如果这里的代码执行了,就说明是ValueError")
except ZeroDivisionError:
print("如果这里的代码执行了,就说明是ZeroDivisionError")
"""
输出结果:
请输入一个数字:10
如果这里的代码执行了,就说明是ZeroDivisionError
"""
正确运用:
try:
num = int(input("请输入一个数字:"))
print(num/0) # <----异常位置
except ValueError:
print("请输入正确的十进制数字")
except ZeroDivisionError:
print("除数不能为0")
"""
输出结果:
请输入一个数字:35413 <----异常位置
除数不能为0
请输入一个数字:浦东未破
请输入正确的十进制数字
"""
一次捕获两次异常
try:
num = int(input("请输入一个数字:"))
print(num/0) # <----异常位置
except (ValueError,ZeroDivisionError):
print("如果出现ValueError,或者ZeroDivisionError异常,则执行这里的代码")
"""
输出结果:
请输入一个数字:32451
如果出现ValueError,或者ZeroDivisionError异常,则执行这里的代码
请输入一个数字:的快速了解f <----异常位置
如果出现ValueError,或者ZeroDivisionError异常,则执行这里的代码
"""
FileNotFoundError异常
try:
num = int(input("请输入一个数字:"))
# print(num/0)
open("XXX.TXT","r") # <----异常位置
except ValueError:
print("请输入正确的十进制数字")
except ZeroDivisionError:
print("除数不能为0")
except (FileNotFoundError):
print("没有这样的文件或目录")
"""
输出结果:
请输入一个数字:574
没有这样的文件或目录
"""
捕获未知的异常
try:
num = int(input("请输入一个数字:"))
# print(num/0)
open("XXX.TXT","r") # <----异常位置
except ValueError:
print("请输入正确的十进制数字")
except ZeroDivisionError:
print("除数不能为0")
except Exception as ret:
"""
Exception所有异常的汇总,ret是自定义的
如果出现未知的异常,那这个未知的异常则会保存到ret这里
"""
print("未知异常:{}".format(ret))
"""
输出结果:
请输入一个数字:5341
未知异常:[Errno 2] No such file or directory: 'XXX.TXT'
没有这样的文件或目录
"""
捕获异常完整版
try:
num = int(input("请输入一个数字:"))
# print(num/0)
# open("XXX.TXT","r") # <----异常位置
except ValueError:
print("请输入正确的十进制数字")
except ZeroDivisionError:
print("除数不能为0")
except Exception as ret:
"""
Exception所有异常的汇总,ret是自定义的
如果出现未知的异常,那这个未知的异常则会保存到ret这里
"""
print("未知异常:{}".format(ret))
else:
print("如果else和try,except联合使用,没有异常的情况下,执行这里的代码")
finally:
print("finally是不管有无异常,都执行这里的代码")
"""
输出结果:
请输入一个数字:54
如果else和try,except联合使用,没有异常的情况下,执行这里的代码
finally是不管有无异常,都执行这里的代码
"""
异常的传递
def test1():
return int(input("请输入数字:"))
def test2():
return test1()
try:
print(test2())
except Exception as ret:
print("未知异常:{}".format(ret))
"""
输出结果:
请输入数字:def op
未知异常:invalid literal for int() with base 10: 'def op'
"""
自定义异常
def input_password():
# 提示用户输入密码
pwd = input("请输入密码:")
# 判断密码的长度
if len(pwd) >= 8:
return pwd
print("主动抛出异常")
ex = Exception("密码长度不够!")
raise ex
try:
print(input_password())
except Exception as ret:
print(ret)
"""
输出结果:
请输入密码:dfji u
主动抛出异常
密码长度不够!
"""