Python 异常处理及程序调试

发表于:2020-8-25 10:55

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:billy    来源:CSDN

  异常概述
  在程序运行过程中,经常会遇到各种各样的错误,这些错误统称为 “异常”。这些异常有的是由于开发者一时疏忽将关键字敲错导致的,这类错误多数产生的是 SyntaxError: invalid syntax(无效的语法),这将直接导致程序不能运行。这类异常是显式的,在开发阶段很容易被发现。还有一类是隐式的,通常和使用者的操作有关。
  Python 中常见的异常如下表所示
  异常处理语句
  在程序开发时,有些错误并不是每次运行都会出现的。这时就需要在开发程序时对可以出现异常的情况进行处理。在 Python 中,提供了 try…except 语句捕获并处理异常。在使用时,把可能产生异常的代码放在 try 语句块中,把处理结果放在 except 语句块中,这样,当 try 语句块中的代码出现错误,就会执行 except 语句块中的代码,如果 try 语句块中的代码没有错误,那么 except 语句块将不执行。
  示例:
  def division():
      '''
      功能:分苹果
      :return: 无
      '''
      print("\n==================== 分苹果了 ====================\n")
      apple = int(input("请输入苹果的个数: "))
      children = int(input("请输入小朋友的个数: "))
      result = apple // children
      remain = apple - result * children
      if remain > 0:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个,剩余", remain, "个")
      else:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个")
  if __name__ == '__main__':
      try:
          division()
      except ZeroDivisionError:
          print("\n出错了 ~_~  小朋友的个数不能为 0 !")
      except ValueError as e:
          print("输入错误: ", e)
  多次运行示例的结果如下所示:
  ==================== 分苹果了 ====================
  请输入苹果的个数: asda
  输入错误:  invalid literal for int() with base 10: 'asda'
  ==================== 分苹果了 ====================
  请输入苹果的个数: 12
  请输入小朋友的个数: 0
  出错了 ~_~  小朋友的个数不能为 0 !
  ==================== 分苹果了 ====================
  请输入苹果的个数: 12
  请输入小朋友的个数: 5
  12 个苹果,评价分给 5 个小朋友,每人分 2 个,剩余 2 个
  完整的异常处理语句应该包含 else 和 finally 代码块。else 代码块在程序没有抛出异常时执行,而 finally 代码块无论是否出现异常都会被执行。
  示例:
  if __name__ == '__main__':
      try:
          division()
      except ZeroDivisionError:
          print("\n出错了 ~_~  小朋友的个数不能为 0 !")
      except ValueError as e:
          print("输入错误: ", e)
      else:
          print("分苹果顺利完成!")
      finally:
          print("进行了一次分苹果操作!")
  如果某个函数或方法可能会产生异常,但不想在当前函数或方法中处理这个异常,则可以使用 raise 语句在函数或方法中抛出异常。在应用 raise 抛出异常时,要尽量选择合理的异常对象,而不应该抛出一个与实际内容不相关的异常。
  示例:
  def division():
      '''
      功能:分苹果
      :return: 无
      '''
      print("\n==================== 分苹果了 ====================\n")
      apple = int(input("请输入苹果的个数: "))
      children = int(input("请输入小朋友的个数: "))
      if apple < children:
          raise ValueError("苹果太少了,不够分!")
      result = apple // children
      remain = apple - result * children
      if remain > 0:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个,剩余", remain, "个")
      else:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个")
  if __name__ == '__main__':
      try:
          division()
      except ZeroDivisionError:
          print("\n出错了 ~_~  小朋友的个数不能为 0 !")
      except ValueError as e:
          print("输入错误: ", e)
      else:
          print("分苹果顺利完成!")
      finally:
          print("进行了一次分苹果操作!")
  上述例子的运行结果为:
  ==================== 分苹果了 ====================
  请输入苹果的个数: 3
  请输入小朋友的个数: 4
  输入错误:  苹果太少了,不够分!
  进行了一次分苹果操作!
  程序调试
  在程序开发过程中,免不了会出现一些错误,有语法方面的,也有逻辑方面的。语法方面的错误比较容易检测,因为程序会直接停止,并且给出错误提示。逻辑错误就不太容易发现了。因为程序可能会一直执行下去,但结果是错误的。所以作为一名程序员,掌握一定的程序调试方法,可以说是一项必备技能。
  在程序开发过程中,除了使用系统自带的调试工具进行调试外,还可以在代码中通过 print() 函数把可能出现问题的变量输出进行查看。这种命令会产生很多垃圾信息,所以调试之后还需要将其删除,比较麻烦。除此之外,Python 还提提供了另外的方法 - 使用 assert 语句调试程序。assert 的中文意思是断言,它一般用于对程序某个时刻必须满足的条件进行验证。
  示例:
  def division():
      '''
      功能:分苹果
      :return: 无
      '''
      print("\n==================== 分苹果了 ====================\n")
      apple = int(input("请输入苹果的个数: "))
      children = int(input("请输入小朋友的个数: "))
      assert apple > children, "苹果不够分!"
      result = apple // children
      remain = apple - result * children
      if remain > 0:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个,剩余", remain, "个")
      else:
          print(apple, "个苹果,评价分给", children, "个小朋友,每人分", result, "个")
  if __name__ == '__main__':
      try:
          division()
      except ZeroDivisionError:
          print("\n出错了 ~_~  小朋友的个数不能为 0 !")
      except ValueError as e:
          print("输入错误: ", e)
      else:
          print("分苹果顺利完成!")
      finally:
          print("进行了一次分苹果操作!")
  触发断言:
  ==================== 分苹果了 ====================
  请输入苹果的个数: 5
  请输入小朋友的个数: 6
  进行了一次分苹果操作!
  Traceback (most recent call last):
    File "D:/Python/Demo/main.py", line 21, in <module>
      division()
    File "D:/Python/Demo/main.py", line 10, in division
      assert apple > children, "苹果不够分!"
  AssertionError: 苹果不够分!
  通常情况下,assert 语句可以和异常处理语句结合使用。
  try:
      division()
  except AssertionError as e:
      print("\n输入有误:", e)
  这样再执行程序时就不会直接抛出异常了。
  注意:assert 语句只在调式阶段有效,我们可以通过在执行 Python 命令时加入 -O(大写)参数来关闭 assert 语句。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号