• Python面向对象之异常


    异常的概念

    • 程序在运行时,如果python解释器遇见一个错误,就会停止程序的运行,并且提示一些错误信息,这就是异常;
    • 程序遇见错误停止执行并且提示错误信息,这个动作我们称之为抛出(raise)异常;

    异常有可能是我们没有按照代码规范而引起的;
    但也有可能即使按照代码规范编写,也会出错,比如我们提示用户输入一个数字,然后int转译,但用户输入一个非数字,就会报错;

    程序开发时,很难将所有情况都处理的面面俱到,通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性;

    捕获异常

    简单的异常捕获

    在程序开发中,如果对某些代码的执行不能确定是否会正确执行,我们可以增加try(尝试)来捕获异常;

    捕获异常最简单的语法格式:

    try:
    	尝试执行的代码
    except:
    	出现错误的处理
    

    try 尝试,下方编写要尝试代码,不确定是否能够正确执行的代码;
    except 如果不是,下方编写尝试失败的代码;

    简单异常捕获示例

    try:
        # 不能确定是否会正确执行的代码
        num = int(input("请输入一个整数:"))
    except:
        # 处理出现错误之后代码
        print("请确保你输入的是一个整数")
    
    print("-"*50)
    
    # 请输入一个整数:1
    # --------------------------------------------------
    
    # 请输入一个整数:a
    # 请确保你输入的是一个整数
    # --------------------------------------------------
    

    错误类型捕获

    在程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常,做出不同的响应,这个时候,就需要使用错误类型捕获了。

    错误类型捕获语法如下:

    try:
    	# 尝试执行的代码
    	pass
    except 错误类型1:
    	# 针对错误类型1,对应的代码处理
    	pass
    except (错误类型2,错误类型3):
    	# 针对错误类型2和3,对应的代码处理
    	pass
    # 下面三句是后面的内容
    except Exception as e:
    	print("未知异常:", e)
    

    当python解释器抛出异常后,最后一行错误信息的第一个单词,就是错误类型,例如下面,错误信息就是 ZeroDivisionError;

    ZeroDivisionError: division by zero
    

    错误类型捕获代码演示

    while 1:
        try:
            num = int(input("请输入一个整数:"))
    
            result = 8/num
            print("8除以这个数字的结果是:", result)
            break
    
        except ZeroDivisionError:
            print("你输入的是一个0,不能被除,请重新输入")
            continue
    
        except ValueError:
            print("请确保你输入的是一个整数,请重新输入")
            continue
    
        except Exception as e:
            print("出错了:%s ,请重新输入", e)
            continue
    
    # 请输入一个整数:0
    # 你输入的是一个0,不能被除,请重新输入
    # 请输入一个整数:a
    # 请确保你输入的是一个整数,请重新输入
    # 请输入一个整数:2
    # 8除以这个数字的结果是: 4.0
    

    捕获未知异常

    在开发时,要预判到所有可能出现的错误,是很难的;
    如果希望程序无论出现任何错误,都不会因为python解释器抛出异常而被终止,可以增加如下语句:

    except Exception as e:
        print("出错了:%s ,请重新输入", e)
    

    捕获未知异常演示

    while 1:
        try:
            num = int(input("请输入一个整数:"))
    
            result = 8/num
            print("8除以这个数字的结果是:", result)
            break
    
        except ValueError:
            print("请确保你输入的是一个整数,请重新输入")
            continue
    
        except Exception as e:
            print("出错了:%s ,请重新输入", e)
            continue
    
    # 请输入一个整数:a
    # 请确保你输入的是一个整数,请重新输入
    # 请输入一个整数:0
    # 出错了:division by zero ,请重新输入
    # 请输入一个整数:1
    # 8除以这个数字的结果是: 8.0
    

    异常捕获完整语法

    在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:

    try:
    	# 尝试执行的代码
    	pass
    except 错误类型1:
    	# 针对错误类型1,对应的代码处理
    	pass
    except (错误类型2,错误类型3):
    	# 针对错误类型2和3,对应的代码处理
    	pass
    except Exception as e:
    	print("未知异常:", e)
    else:
        # 没有异常才会执行的代码
        pass
    finally:
    	# 无论是否出现异常都会执行的代码
        pass
    
    • else 是 只有在没有异常时才会执行的代码;
    • finally 是 无论是否出现异常都会执行的代码;

    异常捕获完整语法示例

    while 1:
        try:
            num = int(input("请输入一个整数:"))
    
            result = 8/num
            print("8除以这个数字的结果是:", result)
    
        except ZeroDivisionError:
            print("你输入的是一个0,不能被除,请重新输入")
            continue
    
        except ValueError:
            print("请确保你输入的是一个整数,请重新输入")
            continue
    
        except Exception as e:
            print("出错了:%s ,请重新输入" % e)
            continue
    
        else:
            print("代码正常执行")
            break
        finally:
            print("无论是否出现异常都会执行的代码")
    

    异常的传递

    • 异常的传递:当代码/方法执行出现异常,会将异常传递给函数/方法的调用一方
    • 如果传递到主程序,还没有处理异常,程序才会被终止;

    提示:

    • 在开发中,可以给主程序增加异常处理
    • 而在主程序中调用其他的函数,只要出现异常,就会传递给主程序的异常捕获;
    • 这样就不需要在函数/方法中,增加大量的异常捕获,可以保证代码的整洁性;

    异常传递处理示例

    def demo1():
        num = int(input("请输入一个整数:"))
        return num
    
    
    def demo2():
        return demo1()
    
    
    # 利用异常的传递性,在主程序捕获异常
    try:
        result = demo2()
        print(result)
    except ValueError:
        print("请确保你输入的是一个整数")
    except Exception as e:
        print("出错了:%s " % e)
    

    抛出(raise)异常

    抛出异常应用场景

    在程序中,除了代码出错解释器会抛出异常之外,还可以根据应用程序 特定业务需求 主动抛出异常
    例如:注册时,如果用户输入的密码少于8位,抛出异常提醒长度不够;

    注意:
    当前函数,只提醒用户输入密码,如果密码长度不够,需要其他额外的函数进行异常处理;
    因此可以抛出异常,由其他需要处理的函数捕获异常.

    抛出异常

    python中提供了一个Exception异常类;
    在开发时,如果满足特定业务需求时,希望抛出异常,可以:

    1.创建一个Exception类的对象
    2.使用raise关键字抛出异常对象
    

    主动抛出异常示例

    def input_pwd():
        pwd = input("请输入密码:")
    
        if len(pwd) >= 8:
            return pwd
        # 创建异常对象,可以使用错误信息字符串作为参数
        short_pwd = Exception("密码长度小于8位")
        # 主动抛出异常
        raise short_pwd
    
    
    try:
        password = input_pwd()
        print(password)
    
    except Exception as e:
        print("出错了:", e)
  • 相关阅读:
    PHPUnit断言详情
    dev tools杂谈
    sublime text3 + python3.5 ide
    文件传输接收sz、rz命令用法
    Linux编辑器vi使用方法详细介绍
    vi编辑字符串替换及sed用法
    Selenium实战(一)——浏览器实例
    Python的数据库连接
    Cypress测试框架——一个简单的测试用例
    Cypress测试框架——入门1
  • 原文地址:https://www.cnblogs.com/yifchan/p/python-1-19.html
Copyright © 2020-2023  润新知