python自学笔记8 —— 异常

python自学笔记8 —— 异常

8.0 概念

在运行代码时出现的ERROR,与语法错误不一样
在写代码时编译器不会报错
异常之后的代码都不能被执行

8.1 异常处理
8.1.1 try-except-finally(单个异常)

以下为基本格式

try : 
    # 可能出现异常的代码
except :
    # 如果有异常执行的代码
finally : 
    # 无论是否存在异常都会被执行的代码 

基本应用 :

def add() :
    try: # 可能出现异常(输入为字符)
        num1 = int(input("num1 = "))
        num2 = int(input("num2 = "))
        sum = num1 + num2
        print(sum,end"")
    except: # 提醒输入必须为数字
        print("Should be numbers!!",end"")
    finally :
        print("    finally!")
add()

# 输入为 : 1 1
# 输出结果为 : 2    finally!
# 输入为 : a 1
# 输出结果为 : Should be numbers!!    finally!
8.1.2 try-except-finally(多个异常)
def divide():
    try:
        num1 = int(input("num1 = "))
        num2 = int(input("num2 = "))
        num3 = num1 / num2
        print(num3)
    except ZeroDivisionError:
        print("除数不能为0")
    except ValueError:
        print("请输入数字")
divide()

# 输入为 : 2 3
# 输出结果为 : 0.6666666
# 输入为 : 1 0
# 输出结果为 : 除数不能为0
# 输入为 : a 1
# 输出结果为 : 请输入数字

可以观察到,异常类型是具有”大小的”,比如常见的ZeroDivisionError与ValueError都包括在Exception中
这时,由于异常判断是有顺序的,就要求我们必须把最大的Exception放到最后。

# 比如,仍是上面的那个除法运算,此时再读取一个文件,但由于文件操作可能出现未知异常,引用Exception异常
def divide():
    try:
        num1 = int(input("num1 = "))
        num2 = int(input("num2 = "))
        num3 = num1 / num2
        print(num3)
        with open("C:\\Users\\Administrator\\Desktop\\1\\a.txt","r") as file: # 已知无该文件
            text = file.read()
    except ZeroDivisionError:
        print("除数不能为0")
    except ValueError:
        print("请输入数字")
    except Exception:
        print("出现异常")
divide()

# 此时输出为下:
# 出现异常

# 但如果代码如下(即将except Exception放到前面):
def divide():
    try:
        num1 = int(input("num1 = "))
        num2 = int(input("num2 = "))
        num3 = num1 / num2
        print(num3)
        with open("C:\\Users\\Administrator\\Desktop\\1\\a.txt","r") as file: # 已知无该文件
            text = file.read()
    except Exception:
        print("出现异常")
    except ZeroDivisionError:
        print("除数不能为0")
    except ValueError:
        print("请输入数字")

divide()

# 当输入为1,0时,会发现,报错并不是除数不能为0,而是出现异常。
# 这说明,由于Exception包括了以下两种异常,导致无法执行小范围异常的处理语句。
# 所以,当多异常处理时,应当将大异常的处理放到最后,防止小异常触发大异常的处理
8.1.3 try-except-else
    try:
        可能出现异常的代码
    except:
        发生异常,执行此处代码
    else:
        未发生异常,执行此处代码
8.1.4 try-finally
    try:
        可能出现异常的代码
    finally:
        无论是否出现异常,执行此处代码
8.2 触发异常

使用raise语句自己触发异常

def error(level):
    if level < 1:
        raise Exception("Invalid level!",level)
error(0)

# 此时编译器报错为:
# Exception: ('Invalid level!', 0)
8.3 捕获异常
def divide():
    try:
        num1 = int(input("num1 = "))
        num2 = int(input("num2 = "))
        num3 = num1 / num2
        print(num3)
    except Exception as err:
        print("出现异常",err)

divide()
# 输入为 : 1 0
# 输出为 : 出现异常 division by zero

自己触发异常,再自己捕获异常

def error(level):
    try:
        if level < 5:
            raise Exception("触发ERROR!",level)
    except Exception as err:
        print("捕获ERROR",err)
    finally:
        print("程序结束!")

error(1)

# 输出结果为 :
# 捕获ERROR ('触发ERROR!', 1)
# 程序结束!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值