Python BUG调试

调试

学问是异常珍贵的东西,从任何源泉吸收都不可耻。——阿卜·日·法拉兹

抛出异常

  • 有的时候调试过程中你希望在某个位置抛出异常,方便调试

  • 这个时候就需求用到 raise

(1) raise 人为的抛出异常

  • raise 关键字

  • 对 Exception 函数的调用

  • 传递给 Exception 函数的字符串,包含有用的出错信息


raise Exception("这里有问题")

(2) 必须使用 try except 来接住异常,否则就会直接爆错误


def tryexcept(data):
    if data == 1:
        raise Exception("这里有问题")
    else:
        print("这里没有问题")


try:
    tryexcept(1)
except:
    print("捕捉到异常了")

取得反向跟踪的字符串,然后写入日志

  • traceback 利用 traceback.format_exc()

import traceback


def bacon():
    raise Exception("这里有问题")


def zhixing():
    bacon()


try:
    zhixing()
except:
    with open("./error.txt", 'w', encoding='utf-8') as item:
        item.write(traceback.format_exc())
    print("结束了")

  • 结果就是把错误信息写入了错误日志里面

Traceback (most recent call last):
  File "g:/练习/Python/index.py", line 13, in <module>
    zhixing()
  File "g:/练习/Python/index.py", line 9, in zhixing
    bacon()
  File "g:/练习/Python/index.py", line 5, in bacon
    raise Exception("这里有问题")
Exception: 这里有问题

断言

断言是一个心智正常的检查,确保代码没有做什么明显错误的事情。这些检查由 assert 语句执行,检查失败抛出异常

  • assert 关键字:

  • 条件(即求值为 True 或者 False)

  • 逗号

  • 当条件为 False 的时候显示的字符串

  • 一般开发的时候用,这样他就不会抛出异常 而是直接挂掉


def designnum(num):
    assert num == 1, '这里num必须是1'
    print("不是1的情况")


designnum(1)
designnum(3)

# 结果
# 当为1的时候 才打印出 不是1的情况
# 当为2的时候 直接就爆错误 这里的num必须是1

'''

Traceback (most recent call last):
  File "g:/练习/Python/index.py", line 7, in <module>
    designnum(3)
  File "g:/练习/Python/index.py", line 2, in designnum
    assert num == 1, '这里num必须是1'
AssertionError: 这里num必须是1

'''

日志模块

  • 要使用日志模块 就要启用 loggin 模块

  • 基本方法


import logging
logging.debug('debug message') # 最低级别
logging.info('info message')   # 用于记录程序中一般事件的信息,或确认一切工作正常
logging.warning('warning message') # 用于表示可能的问题,它不会阻止程序的工作,但是相当会
logging.error('Error message') # 用于记录错误,它导致程序做某事失败
  • 使用的时候把日志保存到文件

import logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                    datefmt='%a, %d %b %Y %H:%M:%S',
                    filename='./test.log',
                    filemode='w')

logging.debug('debug message')
logging.info('info message')
logging.warning('warning message')
logging.error('error message')
logging.critical('critical message')
  • 结果在当前目录下生成一个 test.log 文件,里面是日志信息

Mon, 06 Apr 2020 10:28:29 index.py[line:8] DEBUG debug message
Mon, 06 Apr 2020 10:28:29 index.py[line:9] INFO info message
Mon, 06 Apr 2020 10:28:29 index.py[line:10] WARNING warning message
Mon, 06 Apr 2020 10:28:29 index.py[line:11] ERROR error message
Mon, 06 Apr 2020 10:28:29 index.py[line:12] CRITICAL critical message

禁用日志

  • logging.disable()函数 禁用了这些消息

import logging
logging.disable()
logging.debug('debug message')  # 最低级别
logging.info('info message')   # 用于记录程序中一般事件的信息,或确认一切工作正常
logging.warning('warning message')  # 用于表示可能的问题,它不会阻止程序的工作,但是相当会
logging.error('Error message')  # 用于记录错误,它导致程序做某事失败

# 这样的话它后面根本不会输入信息

VSCODE 插入断点

(1) 点击左边蜘蛛,然后点击上方的设置按钮

(2) 它页面上有个蓝色的方框叫 Add Configuration 之类的

(3) 选择后里面选择 Python,点击 Python 后它里面有

  • Python File

  • Module

  • Remote Attach

  • Attach using Process ID

  • Django

  • Flask

  • Pyramid

(4) 选择 Python File(点击)

(5) 然后他会自动生成一段代码,保存后关闭文件,回到执行的文件

(6) 在左边有数字那列点击一下,会有一个小红点出来.这就表示插入了断点

(7) 按下 F5 这个时候会出现一个选框 里面有单步跳入,跳出之类的。就可以调试了


文章作者: 雾烟云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 雾烟云 !
  目录