• Python 异常捕捉与代码重构


    1 异常

    pYthon使用被称为异常的特殊对象来管理程序执行期间发生的错误。每当发生让python不知所错的错误时,他都会创建一个异常对象。当你编写了处理改异常的代码,该程序将继续运行;如果你未对异常进行处理,程序停止,并显示一个traceback,其中包含有关异常的报告。

    异常是使用try-except代码块处理的。try-except代码块让python执行指定的操作,同时告诉python发生异常时怎么办。

    1.1 处理ZeroDivisionError异常

    1562820655138

    Python无法按照你的要求做时,就会创建这种对象。在这种情况下python会停止运行程序,并指出应发了那种异常。

    1.2 使用 try-except代码块

    当我们认为可能发生错误时,可编写一个try-except代码块来处理可能引发的异常,让你的python尝试运行一些代码,并告诉它这些代码指定的异常,改怎么办?

    #Author:Anliu
    try:
        print(5/0)
    except ZeroDivisionError:
        print("you can't division by zero ...")

    如果try-except代码后面还有其他代码,程序将接着运行,因为已经告诉了python如何处理这种问题。

    1.3 使用异常避免搞崩溃

    发生错误时,如果程序还有工作没有完成,妥善的处理错误就尤为重要了。比如说,要求用户输入的程序中,如果程序能够有效处理无效输入,而不至于崩溃。

    #Author:Anliu
    while True:
        first_number = input("
    Frist_number:")
        if first_number == "q":
            break
        second_number = input("
    second_nmuber:")
        if second_number == "q":
            break
        answer = int(first_number)/int(second_number)
        print(answer)

    这样的程序看起来貌似没有什么问题,但是如果用户输入的内容不是数字或者“q”是将会报错,并且使得程序崩溃。

    1562822176008

    1562822199419


    #Author:Anliu
    while True:
        first_number = input("
    Frist_number:")
        if first_number == "q":
            break
        second_number = input("
    second_nmuber:")
        if second_number == "q":
            break
        try:
            answer = int(first_number)/int(second_number)
        except ZeroDivisionError:
            print("哥们,别逗..")
        except ValueError:
            print("你是猪吗?..")
        else:
            print(answer)


    这样实现了一次登录后的数据记录

    2 重构

    有时候我们有这样的需求:代码能够正常的运行,那可做进一步的修改——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。

    就1.2节的低吗,我们来完成重构。

    要重构以上程序,可将其大部分逻辑放到一个或多个函数中。以上代码重点是实现问候客户,因此我们将其放到一个greet_user()的函数中:

    #Author:Anliu
    import json
    def greet_user():
        filename = "username1.json"
        """问候用户,并指定其名字"""
        try:
            with open(filename,"r",encoding=("utf-8")) as f_obj:
                usernames = json.load(f_obj)
        except FileNotFoundError:
            usernames = input("请输入您的名字?")
            with open(filename,"w",encoding=("utf-8")) as f_obj:
                json.dump(usernames,f_obj)
        else:
            print("欢迎%s登录系统..." %(usernames))
    
    greet_user()

    上述greet_user函数不仅仅是问候用户,还有存储了用户名获取,没有存储输入的功能。

    下面我们再来重构greet_函数,让他不执行这么多任务。为此,我们首先将获取存储的用户名的代码移植到另一个函数中。

    #Author:Anliu
    import json
    
    def get_stored_username():
        '''如果存储了用户,就获取它'''
        filename = "username1.json"
        try:
            with open(filename,"r",encoding=("utf-8")) as f_obj:
                usernames = json.load(f_obj)
        except FileNotFoundError:
            return None
        else:
            return  usernames
    
    def greet_user():
        """问候用户并指出其名"""
        usernames = get_stored_username()
        if usernames:
            print("欢迎%s登录系统..." % (usernames))
        else:
            usernames = input("请输入您的名字?")
            filename = "username1.json"
            with open(filename,"w",encoding=("utf-8")) as f_obj:
                json.dump(usernames,f_obj)
    
    greet_user()

    上述代码已经将存储用户的代码提取出来,通过返回值来确定是否需要用户输入姓名。此时呢,还有一个代码块需要我们重构,就是:没有存储用户名提示时输入用户名的代码?

    #Author:Anliu
    import json
    def get_stored_username():
        '''如果存储了用户,就获取它'''
        filename = "username2.json"
        try:
            with open(filename,"r",encoding=("utf-8")) as f_obj:
                usernames = json.load(f_obj)
        except FileNotFoundError:
            return None
        else:
            return  usernames
    
    def get_new_username():
        '''提示用户输入用户名'''
        usernames = input("请输入您的名字?")
        filename = "username2.json"
        with open(filename, "w", encoding=("utf-8")) as f_obj:
            json.dump(usernames, f_obj)
    
    def greet_user():
        """问候用户并指出其名"""
        usernames = get_stored_username()
        if usernames:
            print("欢迎%s登录系统..." % (usernames))
        else:
            get_new_username()
    
    greet_user()

    如此一来,每一个函数都执行了单一而清晰的任务。

  • 相关阅读:
    中秋假期乱做
    记一道典题 分层图+同余系建图
    Java 创建对象的几种方式
    1029 Median (25 分)(two pointers)
    1107 Social Clusters (30 分)(并查集)
    1153 Decode Registration Card of PAT (25 分)(模拟,排序,map)
    1143 Lowest Common Ancestor (30 分)(二叉查找树)
    1149 Dangerous Goods Packaging (25 分)
    1152 Google Recruitment (20 分)(字符串处理)
    1154 Vertex Coloring (25 分)(set,hash)
  • 原文地址:https://www.cnblogs.com/anttech/p/12663548.html
Copyright © 2020-2023  润新知