【头歌】Python之异常处理
Exception类
第1关:Python异常类与自定义异常
编程要求
按要求自定义MyError异常类,使得当MyError异常发生时,执行评测代码能够输出如下信息。
测试输入:
4
预期输出:
这是我定义的第4个异常
评测说明
评测代码结构大致如下
try:
raise MyError(4)
except MyError as e:
print(e)
解题思路
因为构造函数有数字,所以__init__
在写的时候记得带上数字。
因为有print
,所以注意修改字符串化函数__str__
# -*- coding: utf-8 -*-
class MyError(Exception):
#********begin*********#
def __init__(self,val):
self.val = val
def __str__(self):
return "这是我定义的第%d个异常"%(self.val)
#******** end*********#
第2关:Python中的异常处理结构
编程要求
按照要求补全右侧代码。使得实现以下功能:
当测试输入的字符串长度大于3时抛出MyError异常,并输出长度过长,否则输出长度合适。
并且不论是否抛出异常,执行完成后都要输出执行完毕。
评测说明
测试输入:
abc
预期输出:
长度合适
执行完毕
解题思路
class MyError(Exception):
def __init__(self):
pass
def __str__(self):
return '长度过长,大于3'
def TestLength(x):
x=len(x)
#*********begin*********#
try:
if x > 3:
raise MyError()
# raise Myerror()
# name 'Myerror' is not defined
except Exception as e:
print(e)
else:
print("长度合适")
finally:
print("执行完毕")
#********* end*********#
try…except…finally…
第1关:学习-Python异常处理之try…except…finally…
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,按照提示在 Begin-End 之间补充该程序代码。如果发生了异常,打印异常信息,打印格式如下(冒号为中文冒号):
错误信息为:xxxxxxx
测试说明
平台将使用测试集运行你编写的程序代码,若全部的运行结果正确,则通关。
可在右侧 “测试结果”区查看具体的测试集详情。
测试输入:
f.read()
预期输出:
文件已关闭
测试输入:
f.write()
预期输出:
错误信息为write() takes exactly one argument (0 given)
文件已关闭
解题思路
# 请在下面的 Begin-End 之间按照注释中给出的提示编写正确的代码
########## Begin ##########
f = open("src/step1/test.txt","r")
try:
eval(input()) # eval用来执行一个字符串命令,并返回一个值
# 无except :
# Traceback (most recent call last):
# File "src/step1/error.py", line 5, in <module>
# eval(input()) # eval用来执行一个字符串命令,并返回一个值
# File "<string>", line 1, in <module>
# TypeError: write() takes exactly one argument (0 given)
# except : 错误信息为文件已关闭
except Exception as e:
print("错误信息为",end = "")
print(e,end = "\n")
finally:
f.close()
# 补充代码使普通的 open 语句具有 with open 的功能
########## End ##########
if f.closed:
print("文件已关闭")
else:
print("文件未关闭")
知识探究
else和finally里面的代码可以被捕获异常吗?
测试代码
def test1():
try:
1+1
except Exception as e:
pass
else:
a = 5/0
finally:
pass
def test2():
try:
1+1
except Exception as e:
pass
else:
pass
finally:
a = 5/0
pass
if __name__ =="__main__":
# test1()
test2()
函数1报错:
Traceback (most recent call last):
File “try&else.py”, line 24, in
test1()
File “try&else.py”, line 8, in test1
a = 5/0
ZeroDivisionError: division by zero
函数2报错:
Traceback (most recent call last):
File “try&else.py”, line 25, in
test2()
File “try&else.py”, line 20, in test2
a = 5/0
ZeroDivisionError: division by zero
实验结论
当然是不行的。
else块:try块正常执行后,才会执行该语句。
finally块:不管有没有异常,都会执行的语句。
换而言之,他们就是普通的代码块,只不过写在了 try-catch 里面。
try–except–else–finally的执行顺序
验证代码
def test11():
print('输出:')
try :
a = 5.0 / 0.0
print('try',end = "-->")
except :
print('except',end = "-->")
else :
print('else',end = "-->")
finally :
print('finally')
def test12():
print('输出:')
try :
a = 5.0 / 1.0
print('try',end = "-->")
except :
print('except',end = "-->")
else :
print('else',end = "-->")
finally :
print('finally')
def test21():
print('输出:')
try :
a = 5.0 / 0.0
print('try',end = "-->")
return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
return 3
def test22():
print('输出:')
try :
a = 5.0 / 0.0
print('try',end = "-->")
return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
# return 3
def test23():
print('输出:')
try :
a = 5.0 / 1.0
print('try',end = "-->")
return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
return 3
def test24():
print('输出:')
try :
a = 5.0 / 1.0
print('try',end = "-->")
return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
# return 3
def test25():
print('输出:')
try :
a = 5.0 / 1.0
print('try',end = "-->")
# return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
return 3
def test26():
print('输出:')
try :
a = 5.0 / 1.0
print('try',end = "-->")
# return 0
except :
print('except',end = "-->")
return 1
else :
print('else',end = "-->")
return 2
finally :
print('finally')
# return 3
if __name__ == "__main__":
print("test11:",test11())
print("test12:",test12())
print("test21:",test21())
print("test22:",test22())
print("test23:",test23())
print("test24:",test24())
print("test25:",test25())
print("test26:",test26())
实验结论
在return实验中,可以看出来谁的优先级是最高的。
无论在何种情况下,finally 的return值一定是最先的 —— 因为finally一定能保证执行,也就能保证有返回值。
在报错的情况下,except的的return优先级要高于try,但都是在finally后面的 —— except就是专门应对特殊情况的,try返回的东西很可能造成程序异常。
而在不报错的情况下,try块内的return优先级要高于else —— else可以理解为跟在 try 后面,没有try捕获作用的块。
Reference
https://zhuanlan.zhihu.com/p/360807803
作者:Shadowfight323