Python教程:非常捕捉与代码重构

打印 上一主题 下一主题

主题 554|帖子 554|积分 1662

非常

pYthon使用被称为非常的特别对象来管理步调实行期间发生的错误。每当发生让python不知所错的错误时,他都会创建一个非常对象。当你编写了处理惩罚改非常的代码,该步调将继续运行;假如你未对非常进行处理惩罚,步调停止,并显示一个traceback,其中包罗有关非常的陈诉。
非常是使用try-except代码块处理惩罚的。try-except代码块让python实行指定的操纵,同时告诉python发生非常时怎么办。
1.处理惩罚ZeroDivisionError非常


Python无法按照你的要求做时,就会创建这种对象。在这种情况下python会停止运行步调,并指出应发了那种非常。
2.使用 try-except代码块

当我们认为可能发生错误时,可编写一个try-except代码块来处理惩罚可能引发的非常,让你的python尝试运行一些代码,并告诉它这些代码指定的非常,改怎么办?
  1. try:
  2.     print(5/0)
  3. except ZeroDivisionError:
  4.     print("you can't division by zero ...")
复制代码
假如try-except代码后面还有其他代码,步调将接着运行,因为已经告诉了python怎样处理惩罚这种问题。
3.使用非常制止搞瓦解

发生错误时,假如步调还有工作没有完成,妥善的处理惩罚错误就尤为重要了。比如说,要求用户输入的步调中,假如步调能够有效处理惩罚无效输入,而不至于瓦解。
  1. while True:
  2.     first_number = input("\nFrist_number:")
  3.     if first_number == "q":
  4.         break
  5.     second_number = input("\nsecond_nmuber:")
  6.     if second_number == "q":
  7.         break
  8.     answer = int(first_number)/int(second_number)
  9.     print(answer)
复制代码
这样的步调看起来貌似没有什么问题,但是假如用户输入的内容不是数字或者“q”是将会报错,并且使得步调瓦解。

  1. while True:
  2.     first_number = input("\nFrist_number:")
  3.     if first_number == "q":
  4.         break
  5.     second_number = input("\nsecond_nmuber:")
  6.     if second_number == "q":
  7.         break
  8.     try:
  9.         answer = int(first_number)/int(second_number)
  10.     except ZeroDivisionError:
  11.         print("哥们,别逗..")
  12.     except ValueError:
  13.         print("你是猪吗?..")
  14.     else:
  15.         print(answer)
复制代码
这样实现了一次登录后的数据记录。
重构

有时间我们有这样的需求:代码能够正常的运行,那可做进一步的修改——将代码划分为一系列完成具体工作的函数。这样的过程被称为重构。
就1.2节的低吗,我们来完成重构。
要重构以上步调,可将其大部分逻辑放到一个或多个函数中。以上代码重点是实现问候客户,因此我们将其放到一个greet_user()的函数中:
  1. import json
  2. def greet_user():
  3.     filename = "username1.json"
  4.     """问候用户,并指定其名字"""
  5.     try:
  6.         with open(filename,"r",encoding=("utf-8")) as f_obj:
  7.             usernames = json.load(f_obj)
  8.     except FileNotFoundError:
  9.         usernames = input("请输入您的名字?")
  10.         with open(filename,"w",encoding=("utf-8")) as f_obj:
  11.             json.dump(usernames,f_obj)
  12.     else:
  13.         print("欢迎%s登录系统..." %(usernames))
  14. greet_user()
复制代码
上述greet_user函数不仅仅是问候用户,还有存储了用户名获取,没有存储输入的功能。
下面我们再来重构greet_函数,让他不实行这么多任务。为此,我们首先将获取存储的用户名的代码移植到另一个函数中。
  1. import json
  2. def get_stored_username():
  3.     '''如果存储了用户,就获取它'''
  4.     filename = "username1.json"
  5.     try:
  6.         with open(filename,"r",encoding=("utf-8")) as f_obj:
  7.             usernames = json.load(f_obj)
  8.     except FileNotFoundError:
  9.         return None
  10.     else:
  11.         return  usernames
  12. def greet_user():
  13.     """问候用户并指出其名"""
  14.     usernames = get_stored_username()
  15.     if usernames:
  16.         print("欢迎%s登录系统..." % (usernames))
  17.     else:
  18.         usernames = input("请输入您的名字?")
  19.         filename = "username1.json"
  20.         with open(filename,"w",encoding=("utf-8")) as f_obj:
  21.             json.dump(usernames,f_obj)
  22. greet_user()
复制代码
上述代码已经将存储用户的代码提取出来,通过返回值来确定是否必要用户输入姓名。此时呢,还有一个代码块必要我们重构,就是:没有存储用户名提示时输入用户名的代码?
  1. #学习中遇到问题没人解答?小编创建了一个Python学习交流群:531509025
  2. import json
  3. def get_stored_username():
  4.     '''如果存储了用户,就获取它'''
  5.     filename = "username2.json"
  6.     try:
  7.         with open(filename,"r",encoding=("utf-8")) as f_obj:
  8.             usernames = json.load(f_obj)
  9.     except FileNotFoundError:
  10.         return None
  11.     else:
  12.         return  usernames
  13. def get_new_username():
  14.     '''提示用户输入用户名'''
  15.     usernames = input("请输入您的名字?")
  16.     filename = "username2.json"
  17.     with open(filename, "w", encoding=("utf-8")) as f_obj:
  18.         json.dump(usernames, f_obj)
  19. def greet_user():
  20.     """问候用户并指出其名"""
  21.     usernames = get_stored_username()
  22.     if usernames:
  23.         print("欢迎%s登录系统..." % (usernames))
  24.     else:
  25.         get_new_username()
  26. greet_user()
复制代码
云云一来,每一个函数都实行了单一而清楚的任务。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

李优秀

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表