【头歌】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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 【头歌】Python之异常处理

    发表回复