异常机制

异常机制

异常和错误的区别?

异常:不正常的事件,需要预防和处理;

错误:单词拼写错误,不符合语法规则就是错误

# 对数字进行转型
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
主动抛出异常
密码长度不够!
"""
posted @ 2022-04-08 11:33  猪腩飞了天  阅读(42)  评论(0)    收藏  举报