- 博客主页:盾山狂热粉的博客_CSDN博客-C、C++语言,机器视觉领域博主
- 努力努力再努力嗷~~~✨
⭕总结了python中所有可能的异常情况,有异常不一定是坏事,有提醒作用
可以查看python内置异常大合集
- 除0运算:ZeroDivisionError
- 找不到可读文件:FileNotFoundError
- 值错误:ValueError
- 索引错误:IndexError
- 类型错误:TypeError
- 使用一个未被定义的变量:NameError
- 试图访问字典里不存在的键:KeyError
如果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 模块执行,则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模块是否执行,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 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语句只能引发一个叫AssertionError的异常
多用于调试的时候,可以代替if语句的作用
s = "FishC"
assert s == "FishC"
assert s != "FishC"
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
这里
'''
欢迎点赞 收藏 ⭐留言 如有错误敬请指正!