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