异常调试

抛出异常

  在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直接创建并写入

 

posted @ 2018-03-27 18:25  朝游碧海暮苍梧  Views(161)  Comments(0Edit  收藏  举报