20.python异常

Python 异常

异常就是程序运行的过程中出现了错误

bug就是指异常的意思,因为历史上因为小虫子慌到计算机失灵的案例,所以延续至今,bug就代表软件出现了错误

异常举例如下: FileNotFoundError: [Errno 2] No such file or directory: './img/error.txt'

f = open("./img/error.txt","r")  # 如果error.txt文件不存在,则抛出异常如下

# FileNotFoundError: [Errno 2] No such file or directory: './img/error.txt'

捕获异常

世界上没有完美的程序,在力所能及的范围内,对可能出现的BUG,进行提前准备、提前处理

这种行为我们称之为: 异常处理 (捕获异常)

捕获异常的作用在于:提前假设某处会出现异常,做好提前准备,当真的出现异常的时候,可以有后续手段

语法示例:

try:

  print(name)

except NameError as e:

  print("name变量名称未定义错误")

注意:

  • 如果尝试执行的代码的异常类型和要捕获的异常类型不一致,则无法捕获异常
  • 一般try下方只放一行尝试执行的代码
try:
    f = open("./img/error.txt","r",encoding="UTF-8")
except FileNotFoundError as a:
    print("如果出现异常,因为文件不存在,将open的模式改为w模式要以自已创建文件")
    f = open("./img/error.txt","w",encoding="UTF-8")
    print(a)  # 打印捕获的异常具体信息
else:
    print("程序执行完美,没有异常")

f = open("./img/error.txt","r",encoding="UTF-8")

f.close()
程序执行完美,没有异常
  • 捕获多个异常 (FileNotFoundError, NameError)
try:
    f = open("./img/error.txt","r",encoding="UTF-8")
    print(name)
except (FileNotFoundError, NameError) as a:
    print("如果出现异常,因为文件不存在,或者变量未被定义")
    print(a)  # 打印捕获的异常具体信息
如果出现异常,因为文件不存在,或者变量未被定义
[Errno 2] No such file or directory: './img/error.txt'
  • 捕获所有异常 Exception
try:
    1 / 0
    f = open("./img/error.txt","r",encoding="UTF-8")
    print(name)
except Exception as e:
    print("如果出现异常,因为文件不存在,或者变量未被定义")
    print(e)  # 打印捕获的异常具体信息
else:
    print("程序执行完美,没有异常")
如果出现异常,因为文件不存在,或者变量未被定义
division by zero
  • 异常的finally

finally 表示的是无论是否异常都要执行的代码,例如关闭文件

try:
    1 / 0
    f = open("./img/error.txt","r",encoding="UTF-8")
    print(name)
    print("哈哈")
except Exception as e:
    print("如果出现异常,因为文件不存在,或者变量未被定义")
    print(e)  # 打印捕获的异常具体信息
else:
    print("程序执行完美,没有异常")
finally:
    print("finally 无论有没有异常我都要执行")
    f.close()
如果出现异常,因为文件不存在,或者变量未被定义
division by zero
finally 无论有没有异常我都要执行

异常的传递

异常是具有传递性的,当所有函数都没有捕获异常的时候,程序就会报错

如下例:当函数func01中发生异常,并且没有捕获这个异常的时候,异常会传递到函数func02,当func02也没有捕获这个异常的时候

main函数会捕获这个异常,这就是异常的传递性

def func01():  # 异常在func01中没有被捕获
    print("这是func01开始")
    num = 1 / 0   # 异常代码
    print("这是func01结束")

def func02():  # 异常在func02中没有被捕获
    print("这是func02开始")
    func01()
    print("这是func02结束")

def main():
    try:
        func02()
    except Exception as e:
        print("异常在main函数中被捕获")
        print(e)

main()
这是func02开始
这是func01开始
异常在main函数中被捕获
division by zero