Python 错误处理、logging模块

2019-12-26  本文已影响0人  李霖弢

错误处理

try...except...finally...

BaseException类是所有错误类的基类
如下ZeroDivisionErrorBaseException的子类,所以如果发生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进行一次性配置

通过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")
上一篇下一篇

猜你喜欢

热点阅读