异常和logging日志
1).异常
异常分为两类:1.可控异常(代码能够解决) ->又分为两类(1).编译时异常 (2).运行时异常
2.不可控异常
有的时候即使Python程序的语法是正确的,但在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在这里:
print(1/0) #抛出异常为:ZeroDivisionError: division by zero print(a*3) #抛出异常为:NameError: name 'a' is not defined print('2' + 1) #抛出异常为:TypeError: Can't convert 'int' object to str implicitly
异常以不同的类型出现,这些类型都作为信息的一部分打印出来: 例子中的类型有 ZeroDivisionError,NameError 和 TypeError。
异常类型关系:https://docs.python.org/3/library/exceptions.html#exception-hierarchy
解决异常
我们使用try/except语句来捕获异常。语法如下:
try: (语句) #运行别的代码是否存在异常 except (异常类型1,异常类型2) : (处理语句) #如果在try部份引发了异常类型1,2的异常 except (异常类型3) as name3: print(name3) #我们还可以将异常另起名并输出它 except Exception: #所有异常 当你判断不了程序发生什么异常的时候,可以直接捕获Exception 书写时注意的是:子类在前,父类在后 (处理语句) else: (没有异常) #如果没有异常发生则执行else finally: (程序结束) #无论是否发生异常都会执行finally语句
自定义异常
我们可以通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类,通过直接或间接的方式。
使用raise语句可以抛出一个指定的异常。
如下:
class nomaobo(Exception): #我自定义了一个名为nomaobo的异常 pass try: num=int(input('请输入一个不大于100的数字:')) if num >100: raise nomaobo('醒醒,别睡了') #这里使用raise 将自定义的nomaobo异常抛出 except nomaobo as non: print(non) finally: print('程序结束')
2).日志
日志是一种可以追踪某些软件运行时所发生事件的方法。软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述。
(1).日志的作用
- 程序调试
- 了解软件程序运行情况,是否正常
- 软件程序运行故障分析与问题定位
(2)logging日志的级别
logging日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL。
DEBUG:详细的信息,通常只出现在诊断问题上
INFO:确认一切按预期运行
WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如。磁盘空间低”)。这个软件还能按预期工作。
ERROR:更严重的问题,软件没能执行一些功能
CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行
这5个等级,也分别对应5种打日志的方法: debug 、info 、warning 、error 、critical。默认的是WARNING,当在WARNING或之上时才被跟踪。
(3)日志输出
有两种方式记录跟踪,一种输出控制台,另一种是记录到文件中,如日志文件。
1.将日志输出到控制台
import logging logging.basicConfig(level=logging.DEBUG,) #level=logging.DEBUG 配置输出级别,默认warning logging.debug('this a debug') logging.info('this a info') logging.warning('this a warning') logging.error('this a error') logging.critical('this a critical')
上述代码执行后将在console中输出如下信息:
DEBUG:root:this a debug
INFO:root:this a info
WARNING:root:Tim is 10 year old.
ERROR:root:this a error
CRITICAL:root:this a critical
2.将日志输出到文件
我们还可以将日志输出到文件,只需要在logging.basicConfig函数中设置好输出文件的文件名和写文件的模式
import logging log_format='%(asctime)s-%(levelname)s-%(message)s' DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p" logging.basicConfig(level=logging.DEBUG, filename='my.log', format=log_format, datefmt=DATE_FORMAT) #filename='' 写你要输出的日志的文件名 #format= 输出日志的格式 #datefmt= 输出日期时间的格式 logging.debug('this a debug') logging.info('this a info') logging.warning('%s is %d year old.','Tim',10) #我们也可以异常更改返回内容 ,添加一些参数 logging.error('this a error') logging.critical('this a critical')
这样我们就会在一个名为my.log的文档中查看到我们输出的日志。
#结合一下异常,将一个自定义异常输出到日志中
import logging log_format='%(asctime)s-%(levelname)s-%(message)s' DATE_FORMAT = "%m/%d/%Y %H:%M:%S %p" logging.basicConfig(level=logging.DEBUG, filename='my.log', format=log_format, datefmt=DATE_FORMAT) class nomaobo(Exception): pass try: num=int(input('请输入一个不大于100的数字:')) if num >100: raise nomaobo('醒醒,别睡了') except nomaobo as non: logging.debug(non) finally: print('程序结束')运行这段代码,输入一个大于100的数字,我们将在my.log中得到'醒醒,别睡了', 若发生转译错误,只需更改编码集就可得到。