python学习笔记-tip46(异常处理机制--调试)

引言

出现问题了怎么办?

找问题?

怎么找?

如果是java 或者android的话,我们其实有两种思路:

一种是打log

一种是调试

其实大多数的编程都很类似,python的这两种方法也都可以

python可以使用 print() 打印出需要筛查的变量,或者类,但是缺点是测试完后需要记得删除,略显复杂

当然也可以调试

下面着重讲解下「调试」

调试

说是调试,其实python并不能真正的添加断点进行 断点调试 ,但是python提供的别的好用的方式来实现调试功能:

一、断言-assert

断言的意思是,假定某个条件成立的话,程序怎么运行
断言其实可以应用到任何我们想检测出现问题的地方,我们举个例子

      def foo(s):
            n=int(s)
            #假定n不等于0 
            assert n!=0,'n is zero'
            return 10/n
      foo(0)

我们来看一下程序运行结果

python学习笔记-tip46(异常处理机制--调试)_第1张图片

assert 的意思是,表达式n!=0 应该是True,否则,根据程序运行的逻辑,后边的代码肯定会出错。

如果断言失败的话,就会报出 AssertionError , 并且提示断言中的第二个参数
本例中的第二个参数是“n is zero”

但是,如果程序中到处都是 assert ,那么其实也是很乱的,幸运的是 python 为我们提供了方法

我们可以在运行 python 文件的时候使用 -O 参数来关闭 assert

我们来通过 -O 去执行上方我们运行的文件


python学习笔记-tip46(异常处理机制--调试)_第2张图片

我们可以看到,assert 已经被禁掉了
关闭后,你可以把所有的assert语句当成pass来看。

二、logging

把 print() 改成 logging 也是调试 bug 的一种方式,和assert相比,logging不会抛出错误,而且还可以输出到文件:


python学习笔记-tip46(异常处理机制--调试)_第3张图片

但是发现除了只输出了错误类型,也对程序也没什么影响啊

没关系,只需配置一个logging的配置就可以了
如下


python学习笔记-tip46(异常处理机制--调试)_第4张图片

我们只是在导入logging之后添加了

logging.basicConfig(level=logging.INFO)

这样的话,就能看到效果了

    #执行完后,显示输出了
    INFO:root:n=0

logging的等级

其实

logging.basicConfig(level=logging.INFO)是设置了logging的等级
等级有

  • DEBUG
  • INFO
  • WARNING
  • ERROR
    他们之间有优先级
    ————————————————
    当我们设置了
    level=logging.INFO
    的时候
    logging.debug就看不到输出效果了
    ————————————————
    当我们设置了
    level=logging.ERROR
    的时候
    logging.debug
    logging.info
    logging.warning
    输出的信息也就都看不到了

这样一来,就可以放心的输出不同级别的logging,最后只需要修改一下logging的level就能看到
想要看的logging了


除此之外,logging的另外一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件

三、pdb

pdb则是python的调试器,让程序以单步方式运行,可以随时查看运行状态

下面来看示例
我们准备好一个有错误的程序

      #err.py
      s='0'
      n=int(s)
      print(10/n)

然后我们启动pdb 去单步调试我们的err.py文件
启动方法
python -m pdb err.py

然后进入pdb模式之后,输入命令l(注意,这个不是1 而是英文字母l),可以查看代码

输入命令n,可以向下执行代码

任何情况下输入p 变量名 去查看变量的值

输入q 结束pdb,退出程序

我们来看一下实际案例

python学习笔记-tip46(异常处理机制--调试)_第5张图片

——————————————————————
这种通过p 去逐行调试是万能的,但是如果我们要调试的代码很长的时候呢?那么这个逐行调试就不适用了,幸运的是python为我们提供了方便的方法

pdb.set_trace()

这种方法其实也是用的pdb调试器,但是我们这个时候需要导入pdb类

  import pdb

然后,在可能出错的地方放上这句指定

  #trace有痕迹的意思,这就是设置标记的意思哦
  pdb.set_trace()

这句命令其实就是相当于加了一个端点
我们来看详细代码

  import pdb
  s='0'
  n=int(s)
  pdb.set_trace()#运行到这里程序会暂停,这是可以通过p 变量名查看变量,通过c进行运行
  print(10/n)

好,我们来看一下具体代码和具体操作

python学习笔记-tip46(异常处理机制--调试)_第6张图片

这种方法比直接启动pdb 单行调试效率高很多,但是也不是很高

四、IDE

如果要比较爽的设置断点、单步执行就需要一个支持调试的 IDE 。
目前比较好用的IDE有
Visual Studio Code : https://code.visualstudio.com/,需要安装Python插件。
PyCharm : http://www.jetbrains.com/pycharm/
另外,Eclipse加上pydev插件也可以调试Python程序。
小结
写程序最痛苦的事情莫过于调试,程序往往会以你意想不到的流程来运行,你期待执行的语句其实根本没有执行,这时候,就需要调试了。

虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器

你可能感兴趣的:(python学习笔记-tip46(异常处理机制--调试))