Python 面向对象(四) 异常

目标

  • 了解异常
  • 捕获异常
  • 异常的else
  • 异常finally
  • 异常的传递
  • 自定义异常

一 了解异常

异常就是 错误 bug
异常语句 尝试执行一些可能出现异常的代码, 当出现异常时, 自动执行事先设置好的另外的代码 ,程序就不会报错, 可以继续

二 异常的写法

2.1 语法

try:
	可能发生错误的代码
except:
	如果出现异常, 再执行的代码

2.2 体验

需求 :尝试以r模式打开文件,如果文件不存在就以w模式打开
即 有某文件就只读打开,没有就新建一个然后打开

# --*coding:utf-8*--
"""
需求 :尝试以**r**模式打开文件,如果文件不存在就以**w**模式打开
"""
try:
    a=open("异常体验文本.txt","r")
except:
    a=open("异常体验文本.txt","w")
print(a.read())

2.3 捕获指定异常类型

2.3.1 语法

try:
	可能发生错误的代码
except:
	如果捕捉到该异常类型后,,执行的代码	

- 什么是异常类型 ? 书写了错误代码, 报错时 冒号前面的红字 NameError就是

在这里插入图片描述
0 不能当除数
在这里插入图片描述

2.3.2 体验

try:
	print(abc)
except NameError:
	print("名字错误")
except ZeroDivisionError:
	print("除数不能为0")
try:
    a=5/0
except NameError:
    print("名字书写错误")
except ZeroDivisionError:
    print("0不能做除数")

## 0不能做除数		

注意

  • 如果产生的错误代码, except 里面没有预置, 则无法捕捉异常
  • 一般 try 里面只有一行 可执行 代码

2.3.3 捕获多个指定异常类型

多个异常 放 except后面的括号里面–元组形式

try:
	a=1/0
except (ZeroDivisionError,NameError):
	print("错误")

2.3.4 捕获异常类型 +描述信息

为什么要捕获错误信息?
因为错误信息, 可以帮助我们排查错误信息

try:
	a=1/0
except (ZeroDivisionError,NameError) as 变量:  #用变量 来储存捕获到的错误信息
	print(变量)  #没有引号
try:
    a=5/0
except NameError as 变量:  #用  变量  来储存捕获到的错误信息
    print("名字书写错误")
    print("变量",变量)
except ZeroDivisionError as 变量:
    print("0不能做除数")
    print("捕获到的错误信息是:",变量)
"""
##  0不能做除数
##  变量 division by zero    
"""

0不能做除数
变量 division by zero

2.3.5 捕获所有异常

优点 不用预置 异常类型
如上面的 except (ZeroDivisionError,NameError ) as 变量:

	try:
    a=1/0
except Exception as 变量:
    print("所有异常信息为:",变量)
"""
所有异常信息为: division by zero
"""

Exception 是所有程序异常类的 父类

try:
    a
except Exception as 变量:  #变量  存储错误信息用
    print("所有异常信息为:",变量)

"""
所有异常信息为: name 'a' is not defined
"""

2.4 异常中的else

  • 没有异常 ,要执行的代码 if else
# --*coding:utf-8*--
"""捕获异常"""
try:
    "a"
except Exception as 变量:
    print(变量)
else:
    print("没有异常代码")
    
"""没有异常代码"""

2.5 异常中的finally

  • 有没有 异常,都要执行的文件, 统称放关闭文件
# --*coding:utf-8*--
"""捕获异常"""
try:
 f=open("测试异常.txt","r")
except Exception as 变量:
 f=open("测试异常.txt","w")
else:
 print("没有异常")
finally:
 f.close()

三 异常的传递

体验异常的传递

  • 需求:
    1 尝试只读方式打开test.txt, 如果在就读取, 不在就提示用户
    2 读取内容的要求: 尝试循环读取内容 读取过程中如果检测到用户意外终止程序, 则except捕获异常,并提出用户
# --*coding:utf-8*--
import time
"""	1 尝试只读方式打开test.txt, 如果在就读取,  不在就提示用户
	2 读取内容的要求: 尝试循环读取内容  读取过程中如果检测到用户意外终止程序,  则except捕获异常,并提出用户
"""
try:
    f=open("异常体验文本.txt")
    # print(f.read())
    # print("=============")
    try:
        while True:
            row=f.readline()
            if len(row)==0:#数据长度
                break
            print("row=",row,"len=",len(row))
            time.sleep(1)   # 给用户干预 留出时间
    except:
        #如何文件执行中,有异常,那么except 会捕捉到
        # 执行中 按 □,停止程序
        print("用户意外终止")
    finally:
        f.close()
        print("关闭txt文件")
except:
    print("txt文件异常")

四 自定义异常 raise

将不满足程序逻辑要求的代码, 捕获异常,抛出raise 异常类对象
抛出错误, 不是语法错误, 是不符合逻辑的, 不符合用户要求的错误
[需求] 密码长度不足, 则报异常 ,抛出自定义异常,并捕获该异常
[老的写法 print方式]
[作用] 帮助我们报错, 类型是不满足程序逻辑的错误

while True:
    p = input("请设置您的密码:")
    if len(p)>=5:
        print(f"你的密码是{p},请牢记")
        break
    print("密码不足5位,重新输入")

代码

# --*coding:utf-8*--
"""
[需求]
密度长度不足,则报错,抛出自定义异常,并捕捉该异常
[步骤]
# 先自定义异常类,继承Exception(系统自带的异常类)
# 抛出异常
# 捕获异常
"""
# 自定义异常
class ShortInputError(Exception): #Exception 系统默认异常
    def __init__(self,length,min_len):
        self.length=length  #用户输入的字母长度
        self.min_len=min_len  # 系统要求的最小长度
    # 设置抛出自定义异常描述信息
    def __str__(self):
        return f"你输入的密码{self.length},不足{self.min_len}"
#
def main():
    # 3 抛出异常:尝试执行 用户输入密码,如果长度小于5 ,抛出异常
    try:
        con=input("请你输入您的密码")
        if len(con)<5:
            # 抛出异常类创建的对象,并传入实参
           raise ShortInputError(len(con),5) #抛出异常对象,并传入2个真实数据
   # 4 捕获该异常
    except Exception as result:
        print(result)
    # 5 没有异常时  打印
    else:
        print("没有异常,密码完成输入")
main()
"""
请你输入您的密码1
你输入的密码1,不足5
"""

五 总结

异常的作用
在书写代码是难免出现错误,为了代码运行时 不被错误中断,这个时候,我们可以把 这个可能出现错误的代码 放到try except里面执行

  • 异常语法

      try:
      	可能发生异常的代码
      except:
      	如果出现异常 ,那么就执行 这行代码
      else:
      	没有异常 ,执行的代码
      finally:
      	无论有没有异常都要执行的代码
    
  • 捕获异常

      except 异常类型:   # 指定异常类型,两个用元组括号
      	代码
      except 异常类型 as xx:  # 捕获异常的描述信息
      	代码	
    

在这里插入图片描述

  • 自定义异常

      # 1 自定义异常**类**
      class  异常类类名(Excepion):
      		代码
      		
      		# 设置抛出异常的 描述信息
      		def __str__(self):
      		return ...# 编辑描述异常信息  
      		
      # 2 抛出异常
      raise 异常类名()     #可传参数
      
      # 3 捕捉异常
      except Exception....
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值