python异常:常见异常、处理、断言、自定义异常

一、异常是什么

二、常见异常

三、异常处理

四、不太常用语法

五、主动判处异常

六、断言

七、使用场景

八、自定义异常类型

 

一、异常是什么

"""
    什么是异常?
        异常是错误发生前的一种信号
        如果没有人来处理这个信号 程序就会中断执行并抛出错误信息

    异常的分类:
        1.语法检查异常 这种异常是最低级异常  绝对不应该犯
            也非常好避免
            如果是编译器 会自动提示
            如果是文本编辑器 在你运行代码前 解释器会检查语法
        2.运行时异常(逻辑异常)
            这种异常只有在代码被执行时才能发现
            我们要处理的重点就是运行时异常
            特点:在没有运行代码前 是无法发现的
                如果运行时异常已经发生并且没有正确处理他 就抛出错误信息
                并且中断程序的执行  这是要我们学习异常解决的问题
    异常的组成
        1.追踪信息 (具体发生异常的位置 以及函数的调用顺序)
        2.异常的类型 (错误的类型)
        3.异常的消息 (详细的错误信息)

    我们之所以学习异常处理
        为的是让我们的程序更加稳定 (健壮性) 不容易崩溃


"""
name =
def func():
    import xxaaa

def func1():
    func()

func1()

 

二、常见异常

"""
    常见的发生原因:
    NameError  找不到这个名字 要么变量 要么函数
    ValueError 在调用一个函数时给的的值不正确
    TypeError 类型错误 例如字符串与数字加减乘除  调用一个不能被调用的类型
    ZeroDivisionError 除数不能为0
    KeyError 没有这个key
    IndexError 索引不存在
    StopIteration 没有更多的值可以迭代
    FileNotFoundError 文件不存在
    io.UnsupportedOperation  文件的操作不支持
    AttributeError 没有这个属性
    KeyboardInterrupt  程序被强行终止  ctrl+c




"""
# print(helloword)
# age = int(input("请输入年龄:"))
# li = []
# li()

# "abc" + 123

# 5 / 0
# with open(r"D:\上海python全栈4期\day31\异常处理\1今日内容","rt") as f:
#     pass
# print(f)
# f.read()


# dic = {"age":20}
# dic["sex"]

# li = [1,2,3]
# print(li[-100])

# def my_iter():
#     yield "a"
#     yield "b"
# i = my_iter()
# print(next(i))
# print(next(i))
# print(next(i))

# f = open("test","rt")
# f.write("123")

# li = []
# li.abc


# import time

while True:
    pass

三、异常处理

"""
    要处理异常
        要学的就是一个新的语法

    今后使用最多的写法:
    try:
        这里放可能出现异常的代码
    except: 异常的类型:
        当异常发生并且异常类型匹配时
        执行except中的代码
    注意:一旦try中有代码抛出了异常 后面的代码全都不执行

    练习: 捕获某种类型的异常 捕获任意类异常  感受一下执行顺序
"""
#基本语法:
# print("staring.....")
# try:
#     name
# except NameError:
#     print("名字找不到!")
# print("end.......")

# 多种异常类型处理
# print("staring.....")
# try:
#     name
#     [][-1]
#     pass
# except NameError:
#     print("名字找不到!")
# except IndexError:
#     print("索引超出范围")
# print("end.......")


# 当代码可能出现多种异常时的写法
# print("staring.....")
# try:
#     # name
#     # [][-1]
#     1/0
#     pass
# except NameError:
#     print("名字找不到!")
# except IndexError:
#     print("索引超出范围")
# except ZeroDivisionError:
#     print("除数不能为0")
# print("end.......")

# 当代码可能出现多种异常时的写法2
# print("staring.....")
# try:
#     {}["aaa"]
#     # name
#     # [][-1]
#     1/0
# except (NameError,IndexError,ZeroDivisionError):
#     print("可能名字找不到! 可能所以超出范围 可能除数为0")
# print("end.......")

# 上面两种写法 都可以处理多种异常 但是 异常类型太多了 不可能全写完
# 万能异常类型 Exception 或BaseException   基于OOP的继承和多态
print("staring.....")
try:
    # {}["aaa"]
    # name
    # [][-1]
    1/0
except Exception:
    print("可能名字找不到! 可能所以超出范围 可能除数为0")
print("end.......")

四、不太常用的语法

"""
    不太常用的
    语法1
    try:
    except:
    else: try中没有发生异常时执行

    语法2
    try :
    except :
    finally : 无论是否发生异常 都会执行finally  可以用来回收系统资源!
"""
# print("start...")
# try:
#     # 1/0
#     [][1]
#     pass
# except ZeroDivisionError:
#     print("除数异常")
# except NameError:
#     print("名字异常")
# else:
#     print("else会在 try中没有异常时执行")
# print("end...")


# finally
# print("start...")
# try:
#     # 1/0
#     # [][1]
#     pass
# except ZeroDivisionError:
#     print("除数异常")
# except IndexError:
#     print("索引异常")
# else:
#     print("else会在 try中没有异常时执行")
# finally:
#     print("finally 无论异常是否发生 都会执行!")
# print("end...")


# 使用finally来回收资源
try:
    f = open(r"D:\上海python全栈4期\day31\异常处理\1今日内容","rt",encoding="utf-8")
    f.read()
    # f.write("123")
except Exception:
    print("发生异常了")
finally:
    print("关闭文件!")
    f.close()





print(f.closed)

五、主动跑出异常

"""
    当程序中有一些限制 然而用户没有遵守 我们可以主动抛出异常
    语法:
        raise 异常类型(异常的详细信息)
        类型必须是BaseException的子类
"""
# raise NameError("这就是名字不存在异常!")

age = input("请输入整型的年龄:")
if not age.isdigit():
    raise TypeError("你输入的不是整型!")
age = int(age)
print("十年后你%s岁" % (age + 10))

六、断言

"""
    断言 可以理解断定  就是很清楚 很明确
    什么时候需要断定?
        下面的代码必须依赖上面代码的正确数据
    语法: assert 结果为Bool的表达式
        如果值为True 则继续往下执行
        为False 抛出一个 AssertionError 表示断言失败
    没有assert 也可以使用if来玩 assert 仅仅是简化了代码

"""

# 第一部分代码 负责产生一个列表
li = []
# li.append(1)
# li.append(2)
# 这里一定要确保数据是有效的
# if len(li) < 1:
#     raise ValueError("列表中没有数据!")
assert len(li) > 0
# 需要使用列表中的数据来完成任务 如果没有数据无法完成
print(li[0])
print(li[0])
print(li[0])
print(li[0])

七、使用场景

try:
    print("业务逻辑分层复杂 写了好几百行!")
except Exception:
    print("可能是文件不存在!")
try:
    print("业务逻辑分层复杂 写了好几百行!")
except Exception:
    print("类型不匹配!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
    print("业务逻辑分层复杂 写了好几百行!")
except Exception:
    print("有点问题!")


# 不应该滥用try except
# 什么时候用? 如果你知道为什么出错 应该把代码修改正确 而不是加上try except
# 你不清楚为什么会发生异常! 这时候用try

try:
    f = open("xxxx","rt")
    f.read()
except Exception:
    print("文件不存在!")

八、自定义异常

"""
    当系统提供的这些异常类型 和你要描述的错误不匹配时 就需要自定义异常类型
    写法:
        class 自定义异常类型名称(BaseException):
    总结一下:之所以自定义异常类型 是为了更具体描述你的错误 让使用者一眼就看出了

    关键点:1.如何自定义异常类型
           2.在except中 使用as 来获取异常对象

"""
#  你随便输入一句话 看我喜不喜欢  不喜欢我就抛出异常
# 自定义异常类
class UnlikeError(BaseException):
    def __init__(self,msg,text):
        self.msg = msg
        self.text = text
# 函数中可能抛出异常
def hello():
    text = input("输入一段话:")
    if text == "你真帅":
        print("你说得对!")
    else:
        raise UnlikeError("你再看看...","另一个参数")
# 捕获异常
try:
    hello()
# 获取异常对象
except UnlikeError as e:
    print(e.text)

 

转载于:https://www.cnblogs.com/wuzhengzheng/p/10268514.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值