异常调试

抛出异常

  在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")

结果:

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

原文地址:https://www.cnblogs.com/zsc329/p/8658161.html

时间: 2024-10-10 16:35:41

异常调试的相关文章

SylixOS异常调试的手段

1 适用范围 本文档适用于希望了解当前SylixOS的调试手段的工程师.2 cdump 系统/应用异常调试手段 2.1 cdump简介 cdump 是SylixOS系统下的shell命令,用于系统/应用崩溃的信息记录.cdump可以将内核保存在堆中的异常信息显示出来并清空内核堆中的异常信息或者保存下来. 2.2 cdump的使用方法 当系统/应用程序发生异常时,可以在系统命令行下输入 cdump -s 保存异常信息,异常信息将保存在/var/log/cdump/ 目录下,如图 2.1. [点击并

FrameWork:序列化和反序列化以及异常调试

1.序列化序列化:串行化 对象持久化 将对象存储到文件或数据库的字段中反序列化:将文件恢复成对象作用:1.永久保存数据2.传递数据 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 实现序列化反序列化需要引用命名空间: Using system.runtime.seralization.formatters.binary; Runtime 运行时 serialization 序列化 Formatters 格式化程序,格式器 Bin

6.Swift协议|扩展|访问权限|异常调试|类型转换|运算函数|ARC|类类型初试化器|值类型初始化器

1. 协议(Protocol):与OC之间唯一不同的是Swift中的协议不管是属性还时方法全部是必须实现的 /** protocol*/ protocol FullNamed { /** 计算属性申明,只读的计算属性*/ var fullName:String { get } } /** 实现协议*/ struct Person:FullNamed { /** 实现协议  可以把计算属性实现为存储属性,更改其本身的性质*/ var fullName: String = "abc" }

通达OA 一个数据循环输出程序异常调试的案例

今天,通达OA二次开发交流群里有一个朋友问这样一个问题,通过代码连接数据库后,可以正常显示数据库中的数据,但是循环输出的代码只能输出单行数据,数据表里实际有多条数据,是什么原因导致循环失败的呢? <? include_once("inc/conn.php"); // 如需要连接数据库则包含 include_once("inc/utility_all.php"); // 如需要使用公用函数则包含 include_once("inc/check_type

tangram2.6(XE2)\framework框架加载包异常 调试的地方

添加以下的项目到项目组中, \tangram2.6(XE2)\framework\Core\Tangram_Core.dpk 调试此包的SysModuleMgr.pas的函数,本人还没有测试 function TTangramModule.LoadModule: THandle; begin try Result:=0; case GetModuleType of mtBPL:Result:=SysUtils.LoadPackage(self.FModuleFileName); mtDLL:Re

cgitb--CGI跟踪模块(简化异常调试)

通过启动cgitb模块,可以在web浏览器窗口查看详细的编码异常信息,而不必不停地跳转到web服务器的日志屏幕查看,更方便的定位问题: 异常解决后需关闭CGI跟踪. 在CGI脚本最前面增加如下两行,启动python的CGI跟踪技术: import cgitb cgitb.enable()

Glide加载异常调试

Glide提供了listener链式调用方法,传入一个RequestListener对象,然后实现内部的onException方法,那么在Glide加载图片失败时就会调用这个方法. 代码实现很简单: private RequestListener<String, GlideDrawable> requestListener = new RequestListener<String, GlideDrawable>() { @Override public boolean onExce

11 异常, 日志, 断言和调试

处理异常 java程序设计中, 异常对象都是派生于Throwable类的一个实例, 如果java中内置的异常类不能够满足要求, 用户可以自己创建自己的异常类. Error 类层次结构描述了java运行时系统的内部错误和资源耗尽错误. 应用程序不应该抛出这种类型的对象, 如果出现了内部错误, 除了通知用户, 并尽力使程序安全地终止之外, 也没无能为力了, 这种情况很少出现. 需要主要关注的是 Exception层次结构, 这个层次结构分为两个分支: 有程序错误导致的异常属于 RuntimeExce

[Win32]一个调试器的实现(三)异常

[Win32]一个调试器的实现(三)异常 作者:Zplutor 出处:http://www.cnblogs.com/zplutor/ 本文版权归作者和博客园共有,欢迎转载.但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 这回接着处理上一篇文章留下的问题:如何处理EXCEPTION_DEBUG_EVENT这类调试事件.这类调试事件是调试器与被调试进程进行交互的最主要手段,在后面的文章中你会看到调试器如何使用它完成断点.单步执行等操作.所以,关于这类调