异常的相关知识

💡大纲

⭕总结了python中所有可能的异常情况,有异常不一定是坏事,有提醒作用

一、常见异常

💡可以查看python内置异常大合集

  • 除0运算:ZeroDivisionError
  • 找不到可读文件:FileNotFoundError
  • 值错误:ValueError
  • 索引错误:IndexError
  • 类型错误:TypeError
  • 使用一个未被定义的变量:NameError
  • 试图访问字典里不存在的键:KeyError

⚠️当异常发生的时候,如果不预先设定处理方法,程序就会中断

二、处理异常:提高程序的稳定性和可靠性

(一)try_except

💡如果try内代码块顺利执行,except不被触发;如果try内代码块发生错误,执行except里的代码

👉通过预判的方式来处理异常,一般来说会预判到出现什么错误,预判错误的话还是会中止程序

x = 10
y = 0
try:
    z = x/y
except ZeroDivisionError: 
    print("0不可以被除!")    

 ⚠️只预判一个异常,很难预判到,所以就可以多写几个

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
    ls[3]
    d["age"]
except NameError:
    print("变量名不存在")
except IndexError:
    print("索引超出界限")
except KeyError:
    print("键不存在")

⚠️ 就算多写几个,还是很难预判到是什么类型的错误,可以使用Exception

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
    ls[3]
    d["age"]
except Exception:
    print("出错啦") # 有错就报错

⚠️ 虽然知道了错误,但是不知道是哪种类型的错误,可以使用as来捕获异常的值

ls = []
d = {"name": "鲁班七号"}
# y = x
try:
    y = m
    # ls[3]
    # d["age"]
except Exception as e: # 虽不能获得错误具体类型,但可以获得错误的值
    print(e) # name 'm' is not defined

(二)try_except_else

💡如果try 模块执行,则else模块也执行(更像是对于try模块的继续表达或后续声明)

try:
    with open("测试文件.txt") as f:
        text = f.read()
except FileNotFoundError:
    print("找不到该文件")
else:
    for s in ["\n", ",", "。", "?"]: # 去掉换行符和标点符号
        text = text.replace(s, "")
    print("该文件共由{}个字组成。".format(len(text)))

(三)try_except_finally

💡不论try模块是否执行,finally最后都执行

👉finally一般都是执行收尾工作,比如文件的关闭

ls = []
d = {"name": "鲁班七号"}
try:
    y = m
except Exception as e:
    print(e)
finally:
    print("哎~我一直都在")

⭕总结

 

三、异常的嵌套

💡 看内部异常与外部异常哪个先发生,若外部异常先发生直接跳过内部异常,执行finally语句

try:
    try:
        520 + "FishC"
    except:
        print("内部异常")
    1 / 0
except:
    print("外部异常")
finally:
    print("收尾工作")
'''
内部异常
外部异常
收尾工作
'''
try:
    1 / 0
    try:
        520 + "FishC"
    except:
        print("内部异常")
except:
    print("外部异常")
finally:
    print("收尾工作")
'''
外部异常
收尾工作
'''

四、raise语句 

(一)主动引发异常

💡在上述情况下的异常都是采用被动防御的姿态,可以使用raise语句来进行“自爆”,这种情况不能引爆一个不存在的异常类型

raise ValueError("值不正确")
'''
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[5], line 1
----> 1 raise ValueError("值不正确")

ValueError: 值不正确
'''
raise FishCError("小甲鱼")
'''
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[7], line 10
      1 # raise ValueError("值不正确")
      2 '''
      3 ---------------------------------------------------------------------------
      4 ValueError                                Traceback (most recent call last)
   (...)
      8 ValueError: 值不正确
      9 '''
---> 10 raise FishCError("小甲鱼")

NameError: name 'FishCError' is not defined
'''

(二)偷天换日:用一个异常来替换真正的异常

💡这种情况python其实会自己识别,并说明是哪种异常

try:
    1 / 0
except:
    raise ValueError("这样可不行")
'''
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
Cell In[8], line 2
      1 try:
----> 2     1 / 0
      3 except:

ZeroDivisionError: division by zero

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
Cell In[8], line 4
      2     1 / 0
      3 except:
----> 4     raise ValueError("这样可不行")

ValueError: 这样可不行
'''

(三)异常链

raise ValueError("这样可以不行") from ZeroDivisionError
'''
---------------------------------------------------------------------------
ZeroDivisionError                         Traceback (most recent call last)
ZeroDivisionError: 

The above exception was the direct cause of the following exception:

ValueError                                Traceback (most recent call last)
Cell In[9], line 1
----> 1 raise ValueError("这样可以不行") from ZeroDivisionError

ValueError: 这样可以不行
'''

五、assert语句 

💡能主动引发异常,但是assert语句只能引发一个叫AssertionError的异常

👉多用于调试的时候,可以代替if语句的作用

s = "FishC"
assert s == "FishC"
assert s != "FishC"

六、利用异常来实现goto

try:
    while True:
        while True:
            for i in range(10):
                if i > 3:
                    raise # 这里相当于goto语句
                print(i)
            print("跳过")
        print("跳过")
    print("跳过")
except:
    print("这里")
'''
0
1
2
3
这里
'''

 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

盾山狂热粉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值