千家信息网

分析Python的错误,调试和测试方法

发表于:2024-11-21 作者:千家信息网编辑
千家信息网最后更新 2024年11月21日,本篇内容主要讲解"分析Python的错误,调试和测试方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"分析Python的错误,调试和测试方法"吧!错误处理
千家信息网最后更新 2024年11月21日分析Python的错误,调试和测试方法

本篇内容主要讲解"分析Python的错误,调试和测试方法",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"分析Python的错误,调试和测试方法"吧!

  错误处理

  在预防程序发生运行错误的时候,可以预先设置返回一个错误代码,然后在执行程序的时候,就会知道程序是否正确。

  用错误码来表示是否出错有时候也十分的不方便,因为函数本身应该返回的正常结果和错误码混在一起,会导致必须用大量的代码去判断代码是否出错:

  def foo():

  r = some_function()

  if r == (-1):

  return -1

  return r

  def bar():

  r = foo()

  if r==(-1):

  print('Error')

  else:

  pass

  一旦发生错误,还需要各个函数之间互相传递,用起来不方便,所以try…except…finally就被广泛的用于试验错误。

  try

  下面这个例子可以让我们了解try的使用方法:

  >>> try:

  print("try...")

  r = 10 / 0

  print("result:",r)

  except ZeroDivisionError as e:

  print("except:",e)

  finally:

  print("Finally")

  try...

  except: division by zero

  Finally

  如果执行出错,则后续代码不会继续执行,而是直接跳转至错误处理代码,即except语句块,执行完except后,如果有finally语句块,则执行finally语句块,至此,执行完毕。

  如果将上面的0改成5,则不会报错,正常运行。

  >>> try:

  print("try...")

  r = 10 / 5

  print("result:",r)

  except ZeroDivisionError as e:

  print("except:",e)

  finally:

  print("Finally")

  try...

  result: 2.0

  Finally

  可以看出不再执行except语句,只要一个程序中有finally语句,他肯定会被执行。

  int()函数可能会抛出ValueError,所以我们用一个except捕获ValueError,用另一个except捕获ZeroDivisionError。此外,如果没有错误发生,可以在except语句块后面加一个else,当没有错误发生时,会自动执行else语句:

  try:

  print('try...')

  r = 10 / int('5')

  print('result:', r)

  except ValueError as e:

  print('ValueError:', e)

  except ZeroDivisionError as e:

  print('ZeroDivisionError:', e)

  else:

  print('no error!')

  finally:

  print('finally...')

  print('END')

  Python的错误其实也是一种类,所有的错误类型都继承自BaseException,所以在使用except不但捕获该类型的错误,还把其子类也"一网打尽":

  try:

  foo()

  except ValueError as e:

  print('ValueError')

  except UnicodeError as e:

  print('UnicodeError')

  第二个except永远也捕获不到UnicodeError,因为UnicodeError是ValueError的子类,如果有,也被第一个except给捕获了。

  常见错误及其关系

  不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。

  def foo(s):

  return 10 / int(s)

  def bar(s):

  return foo(s) * 2

  def main():

  try:

  bar('0')

  except Exception as e:

  print('Error:', e)

  finally:

  print('finally...')

  调用栈

  如果错误没有被捕获,它就会一直往上抛,最后被Python解释器捕获,打印一个错误信息,然后程序退出。下面这个例子可以很好地展示这种操作:

  def foo(s):郑州妇科医院哪家好 http://www.120zzzy.com/

  return 10 / int(s)

  def bar(s):

  return foo(s) * 2

  def main():

  bar('0')

  main()

  运行显示结果:

  Traceback (most recent call last):

  File "F:/python文件/tiaoshi/__init__.py", line 10, in

  main()

  File "F:/python文件/tiaoshi/__init__.py", line 8, in main

  bar('0')

  File "F:/python文件/tiaoshi/__init__.py", line 5, in bar

  return foo(s) * 2

  File "F:/python文件/tiaoshi/__init__.py", line 2, in foo

  return 10 / int(s)

  ZeroDivisionError: division by zero

  下面我们就来解读一下这个输出的结果,首先第一句:

  Traceback (most recent call last):

  告诉我们这是错误的跟踪信息。

  File "F:/python文件/tiaoshi/init.py", line 10, in <\module>

  main()

  代码中第10行调用main函数出错,原因是第8行.

  File "F:/python文件/tiaoshi/init.py", line 8, in main

  bar('0')

  代码中第8行调用bar函数出错,原因是第5行.

  File "F:/python文件/tiaoshi/init.py", line 5, in bar

  return foo(s) * 2

  代码中第5行返回foo函数出错,原因是return 10 / int(s)这个语句出错了,这是错误产生的源头,因为下面打印了:

  ZeroDivisionError: integer division or modulo by zero

  根据错误类型ZeroDivisionError,我们判断,int(s)本身并没有出错,但是int(s)返回0,在计算10 / 0时出错,至此,找到错误源头。

  标题出错的时候,一定要分析错误的调用栈信息,才能定位错误的位置。

  记录错误

  如果不捕获错误,自然可以让Python解释器来打印出错误堆栈,但程序也被结束了。既然我们能捕获错误,就可以把错误堆栈打印出来,然后分析错误原因,同时,让程序继续执行下去。Python内置的logging模块可以非常容易地记录错误信息:

  import logging

  def foo(s):

  return 10 / int(s)

  def bar(s):

  return foo(s) * 2

  def main():

  try:

  bar('0')

  except Exception as e:

  logging.exception(e)

  main()

  输出结果:

  END

  ERROR:root:division by zero

  Traceback (most recent call last):

  File "F:/python文件/tiaoshi/__init__.py", line 14, in main

  bar('0')

  File "F:/python文件/tiaoshi/__init__.py", line 9, in bar

  return foo(s) * 2

  File "F:/python文件/tiaoshi/__init__.py", line 5, in foo

  return 10 / int(s)

  ZeroDivisionError: division by zero

  Python内置的try…except…finally用来处理错误十分方便。出错时,会分析错误信息并定位错误发生的代码位置才是最关键的。

  程序也可以主动抛出错误,让调用者来处理相应的错误。但是,应该在文档中写清楚可能会抛出哪些错误,以及错误产生的原因。

到此,相信大家对"分析Python的错误,调试和测试方法"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0