zoukankan      html  css  js  c++  java
  • 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()

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

  • 相关阅读:
    C错误调试:当前不会命中断点。没有与此行关联的可执行代码
    将不同的数据写入不同的文件中
    UMFPACK调用的接口
    求解压力备份()
    用C++实现向量二范数
    编写参考文献的方法
    改写UMFPACK算例中的压缩方式(二)
    div文字多行展示,多出的文字用省略号代替
    Internet Explorer Developer Toolbar 中文
    (转帖)天下第七C#学习笔记(3)
  • 原文地址:https://www.cnblogs.com/anttech/p/12663548.html
Copyright © 2011-2022 走看看