Python 错误处理、logging模块
2019-12-26 本文已影响0人
李霖弢
错误处理
try...except...finally...
BaseException
类是所有错误类的基类
如下ZeroDivisionError
是BaseException
的子类,所以如果发生ZeroDivisionError
错误,总会被BaseException
先捕获而不会进入ZeroDivisionError
try:
print('try...')
r = 10 / int('2')
print('result:', r)
except BaseException as e:
print('BaseException:', e)
except ZeroDivisionError as e:
print('ZeroDivisionError:', e)
else:
print('no error!')
finally:
print('finally...')
print('END')
with
如表达式执行成功,其返回资源会授予变量名,待内容执行完毕后释放资源。如执行失败也不会捕获错误,程序照常中断,但资源依然会被释放。
with open('nemo.txt') as f:
print(f.read())
print(f.closed) # True
抛出错误
可以通过raise
抛出一个系统自带的错误实例,也可以自定义一个错误实例并抛出
class FooError(ValueError):
pass
def foo(s):
n = int(s)
if n==0:
raise FooError('invalid value: %s' % s)
return 10 / n
foo('0')
断言
assert
判断为True时同pass
,False时将会抛出错误
当执行时可以通过python -O <文件名>
的方式关闭assert
,此时均视为pass
assert n != 0, 'n is zero!'
单元测试
文档测试
logging模块
logging模块是Python内置的标准模块,主要用于输出运行日志,比起print,logging可以在不同场景根据日志等级(默认为logging.WARNING
)决定是否输出,且可以将日志保存到文件。
基础函数
函数 | 说明 |
---|---|
logging.debug(msg, *args, **kwargs) | 创建一条严重级别为DEBUG的日志记录 |
logging.log(level, *args, **kwargs) | 创建一条严重级别为level的日志记录 |
logging.basicConfig(**kwargs) | 对root logger进行一次性配置 |
- 其中
debug
方法可以替换为info()
、warning()
、error()
和critical()
,其日志等级依次提高。
通过logging.basicConfig()
可以配置日志格式、等级、输出位置等
import logging
logging.basicConfig(format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s',
level=logging.DEBUG,
datefmt = '%Y-%m-%d %H:%M:%S %a',
filename='new.log',
filemode='a',#模式,默认为a,追加模式。w则为覆写模式
)
logging.info("hello world")
也可以通过handlers
指定编码类型等
import logging
fh = logging.FileHandler(encoding='utf-8', mode='a', filename='logger.log')
sh = logging.StreamHandler() #如无sh则不会在命令行输出错误
logging.basicConfig(handlers=[
sh, fh], format='%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s', level=logging.DEBUG)
logging.info("hello world")