欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【循序渐进学Python】Python异常的捕获与处理

程序员文章站 2022-04-07 16:54:39
...

【循序渐进学Python】Python异常的捕获与处理

今天我们学习Python中的异常,做过程序的小伙伴都知道,一个程序不可能是一下就成功的,所以就避免不了出现异常,那么出现了异常,我们就要对异常进行捕获和处理,这就是我们这篇博客要讲的异常的捕获与处理!

什么是异常?

  • 当我们程序在运行过程中,出现了一些错误,或者语法逻辑出现问题,解释器此时无法继续正常执行,反而出现了一些错误的提示,这就是异常(错误代码或者bug)

程序出现了异常会怎么样呢?

  • 程序在运行过程中出现了异常,轻则功能无法实现或者功能出错,重则整个程序崩溃

捕获异常

  • 捕获异常是在编程中常用的一种处理代码中可能会出现漏洞的一些基础的解决方案

捕获异常的做法(捕获异常类似于捕猎)

使用try-except语法

try:

可能出现异常的模块代码全部放在这个里面

except:

如果try里面的任意一行代码出现了异常会直接跳出try进入到except里面执行

注意:

  • 这种捕获异常存在一个问题,只会捕获到异常然后执行except中的处理代码,但是并无法得知异常的问题

捕获异常案例:

try:
    # 将自己觉得可能出现异常的模块代码全部放在这个里面
    f = open("ylt.txt", "r")
except:
    #  如果上面try的代码出现了异常那么程序不会直接崩溃,直接跳到except里面执行
    f = open("ylt.txt", "w")

捕获指定异常

语法:

try:

可能出现异常的模块代码全部放在这个里面

except 可能出现异常的类型:

如果捕获到异常是指定的这个类型的执行代码

捕获指定异常案例:

try:
    a = 10
    print(a)
    b = 10
    print(a / b)
    print("1" + 2)
# except NameError:
#     print("请检查变量a在使用的时候是否存在")
# except ZeroDivisionError:
#     print("除数不能为0")
except (NameError, ZeroDivisionError, TypeError) as result:
    print(result)

注意:

  1. 如果执行的代码异常类型和要捕获的异常类型不一致则无法捕获异常
  2. 一般try下面只放一行尝试的代码
  3. 在使用捕获指定异常的时候一定考虑所有有可能出现的异常类型
  4. 将捕获的区域中的代码出现的指定的异常问题的描述信息运用as存放在变量中,然后输出

捕获多个指定异常

  • 当在捕获异常的时候,可以把要捕获的异常类型的名字,放到except之后,并使用元祖的方式进行体现,或者采用多个except之后放上不同的异常类型的名字

捕获所有异常案例:

  • 所有异常类的父类都是Exception类
try:
    a = 10
    print(a)
    b = 0
    print(a / b)
    print("1" + 2)
except Exception as result:
    print(result)

异常类

  • 异常类是指在Python内置的一些类,这些类代表了python中的一些异常问题
print(a)

# 直接执行会抛如下异常

NameError: name 'a' is not defined

# 在异常信息中“:”之前的单词叫做异常类,之后的叫异常信息

异常的else

  • else表示的是如果没有捕获到异常则需要执行的代码

实例:

try:
    a = 10
    print(a)
    b = 10
    print(a / b)
    print("1" + "2")
except Exception as result:
    print(result)
else:
    print("恭喜你没有bug")

异常的finnally

  • finnally表示最终结果,不论代码是否捕获到异常(try中的代码执行之后不管是进入了except还是else)最终都要进入finnally执行

实例:

try:
    a = 10
    b = 10
    print(a / b)
    print("1" + "2")
except Exception as result:
    print(result)
else:
    print("恭喜你没有bug")
finally:
    print("程序顺利执行完")

异常传递

需求:计算1+100

import time

# 程序的时间线
def fun():
    try:
        res = 0
        print("1" + 2)
        print(time.time())
        try:

            for i in range(1, 101):
                res += i
                print(res)
                time.sleep(2)
        except:
            print("程序被意外终止1")
    except:
        print("程序被意外终止2")
    finally:
        print(time.time())
        return res


print(fun())

自定义异常

  • 在python中一般抛出的异常的语法是异常类对象,这些异常类对象是Python提前封装好的

需求:检测一些数据例如年龄不能小于0(小于0抛异常)

自定义异常类

class AgeInputError(Exception):
    def __init__(self, age):
        self.age = age
        self.minage = 0

    def __str__(self):
        return f"你输入的年龄是{self.age},不能小于{self.minage}"


def main():
    try:
        age = int(input("请输入年龄:"))
        if age < 0:
            # raise 关键字是返回一个异常
            raise AgeInputError(age)
    except Exception as res:
        print(res)
    else:
        print("年龄无误")
    finally:
        print("注册完成")


main()

注意:

  • python中的raise关键字用于引发一个异常,基本上作用和C#中或Java中的throw关键字相同