异常调试

Posted zsc329

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异常调试相关的知识,希望对你有一定的参考价值。

抛出异常

  在Python中,要想引发异常,最简单的形式就是输入关键字raise,后跟要引发的异常的名称。异常名称标识出具体的类: Python异常处理是那些类的对象。

#当程序出现错误,python会自动引发异常,
# 也可以通过raise显示地引发异常。
# 一旦执行了raise语句,raise后面的语句将不能执行。

def boxprint(symbol,length,height):
    if len(symbol)!=1:
        raise Exception(Symbol Wrong)
    # 如果引发Error异常,后面的代码将不能执行
    if length<=2:
        raise Exception(Length Wrong)
    if height<=2:
        raise Exception(Height Wrong)
    # 如果不使用try......except这种形式,那么直接抛出异常,不会执行到这里
    print(symbol*length)
    print(symbol+symbol.rjust(length-1, ))
    print(symbol * length)

for s,l,h in ((*,5,5),(8,8,8),(--,5,5),(8,1,1)):
    #此处每组3个元素,否则报错ValueError: not enough values to unpack
    try:
        boxprint(s,l,h)
    except Exception as wr:
        #此处的as不可以省略,得出错误要输出,exception是类,要取返回值
        print(str(wr))

结果:

*****
*   *
*****
88888888
8      8
88888888
Symbol Wrong
Length Wrong

有效避免出现程序崩溃

 

发生错误时写入文件

  python遇到错误会显示错误信息并终止运行,可以在日志中记录文件,导入反向跟踪错误的结果

  调用traceback

import traceback
# python中用于处理异常栈的模块是traceback模块
# 它提供了print_exception、format_exception等输出异常栈等常用的工具函数。
try:
    raise Exception(just wrong)
except:
    errorfile = open(errornote.txt,w)
    print(errorfile.write(traceback.format_exc()))
    #traceback.print_exc()跟traceback.format_exc()有什么区别呢?
    # format_exc()返回字符串,print_exc()则直接给打印出来。
    # 即traceback.print_exc()与printtraceback.format_exc()效果是一样的。
    errorfile.close()
    print("write down")

结果:

170
write down
#errornote.txt
Traceback (most recent call last):
  File "D:/pyfile/pythonlearn/exceptiontest/errorinfo.py", line 3, in <module>
    raise Exception(just wrong)
Exception: just wrong

 

断言

  assert语句是说:我断言XX为真,如果不为真,则程序有问题

  是一种检查程序逻辑的语句,针对程序员的错误,并非用户错误

  方便检查代码

  assert语句通常包括assert关键字,条件(求Ture/Fales),逗号,到条件为False时的字符串

p=[open,close]
for i in p:
    assert i==open,something wrong
    print(i)

结果:

open
Traceback (most recent call last):
  File "D:/pyfile/pythonlearn/exceptiontest/assesttest.py", line 3, in <module>
    assert i==open,something wrong
AssertionError: something wrong

直接报错,便于更改逻辑问题

 

日志

   print语句就是用了记日志的方式来调试代码,记日志是一种很好的方式,可以理解程序中发生的事情以及顺序

   logging模块使得很容易创建自定义的消息记录,这些日志消息将描述程序执行何时到达日志函数调用,并且指出任何变量当时的值

  另一方面,缺失日志信息表明有一部分代码被跳过并未执行

例:阶乘算法写入日志

 

import logging
logging.basicConfig(level=logging.DEBUG,format= %(asctime)s - %(levelname)s - %(message)s)
#logging.basicConfig规定格式
#logging.debug写入日志
logging.debug(start of program)

def factorial(n):
    logging.debug(start of factorial(%s%%)%(n))
    total=1
    for i in range(1,n+1):
        total*=i
        logging.debug(i is +str(i)+,total is +str(total))
    logging.debug(end of factorical(%s%%)%(n))
    return total

print(factorial(5))
logging.debug(end of program)

 

结果:

2018-03-27 17:46:40,859 - DEBUG - start of program
120
 2018-03-27 17:46:40,859 - DEBUG - start of factorial(5%)
 2018-03-27 17:46:40,859 - DEBUG - i is 1,total is 1
 2018-03-27 17:46:40,859 - DEBUG - i is 2,total is 2
 2018-03-27 17:46:40,859 - DEBUG - i is 3,total is 6
 2018-03-27 17:46:40,859 - DEBUG - i is 4,total is 24
 2018-03-27 17:46:40,859 - DEBUG - i is 5,total is 120
 2018-03-27 17:46:40,859 - DEBUG - end of factorical(5%)
 2018-03-27 17:46:40,859 - DEBUG - end of program

 logging模块的日志级别:

  debug : 打印全部的日志,详细的信息,通常只出现在诊断问题上

  info : 打印info,warning,error,critical级别的日志,确认一切按预期运行

  warning : 打印warning,error,critical级别的日志,一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”),这个软件还能按预期工作

  error : 打印error,critical级别的日志,更严重的问题,软件没能执行一些功能

  critical : 打印critical级别,一个严重的错误,这表明程序本身可能无法继续运行

python logging模块 basicConfig配置文件:

  filename: 指定日志文件名

  filemode: 和file函数意义相同,指定日志文件的打开模式,‘w‘或‘a‘

  format: 指定输出的格式和内容,format可以输出很多有用信息,如上例所示:

     %(levelno)s: 打印日志级别的数值

     %(levelname)s: 打印日志级别名称

     %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]

     %(filename)s: 打印当前执行程序名 %(funcName)s: 打印日志的当前函数

     %(lineno)d: 打印日志的当前行号

     %(asctime)s: 打印日志的时间  

     %(thread)d: 打印线程ID

     %(threadName)s: 打印线程名称

     %(process)d: 打印进程ID

     %(message)s: 打印日志信息

 禁用日志:

logging.disable(logging.DEBUG)

 

日志级别大写

使程序之后的日志写入无效

 

将日志写入文件:

logging.basicConfig(filename=D:\pyfile\pythonlearn\exceptiontest\jiechennote.txt ,level=logging.DEBUG,format= %(asctime)s - %(levelname)s - %(message)s)

 

filename直接创建并写入

 

以上是关于异常调试的主要内容,如果未能解决你的问题,请参考以下文章

PHP代码-psysh调试代码片段工具

按钮在片段中不起作用

应用调试系统调用SWI

运行/调试你的PHP代码

使用实体框架迁移时 SQL Server 连接抛出异常 - 添加代码片段

异常和TCP通讯