zoukankan      html  css  js  c++  java
  • 异常调试

    抛出异常

      在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:pyfilepythonlearnexceptiontestjiechennote.txt' ,level=logging.DEBUG,format=' %(asctime)s - %(levelname)s - %(message)s')

    filename直接创建并写入

  • 相关阅读:
    七个高效的文本编辑习惯(以Vim为例)
    rbx1 package 下载安装过程
    ros机器人开发概述
    ROS BY EXAMPLE 1 -- 环境设置与安装
    除法取模练习(51nod 1119 & 1013 )
    kinect driver install (ubuntu 14.04 & ros-indigo)
    ros问题总结
    200行代码搞定炸金花游戏(PHP版)
    JavaScript方法call,apply,caller,callee,bind的使用详解及区别
    javascript中apply、call和bind的区别
  • 原文地址:https://www.cnblogs.com/zsc329/p/8658161.html
Copyright © 2011-2022 走看看