- 📢博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 📢努力努力再努力嗷~~~✨
💡大纲
⭕总结了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
这里
'''
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!