python异常处理和日志处理方式


Posted in Python onDecember 24, 2019

今天,总结一下最近编程使用的python异常处理和日志处理的感受,其实异常处理是程序编写时非常重要的一块,但是我一开始学的语言是C++,这门语言中没有强制要求使用try...catch语句,因此我通常编写代码的时候忽略了这一块,直到开始学习java的时候,发现好多时候编写代码必须加上try...catch 模块,然而我每次都不深入理解,仅仅使用eclipse自动补全功能加上try...catch模块,或者直接在类上加入throws Exception最省事,完全不用思考。

最近在编写python代码的时候,发现python好多代码也有try...catch模块,实在是不想再继续不理解了,于是自己思考了一下。

python异常处理

python的异常处理代码很简单,如下所示:

try:
 ...(可能出现异常的代码)
except ...(Python内置异常类或者自己实现的异常类) as e: (或者直接except:) 
 ...(处理该异常的代码)

我平常根本不管异常处理,什么异常都直接不管,因为控制台会打印出现异常的那一行,然后如果出现错误,我就根据那一行仔细思考可能出现的逻辑错误。今天,我仔细思考了一下,我这样做会出现两个主要问题:

任何错误都会导致程序中断错误提示不明显,找错误的时间变长

解释:

问题1:我之所以总是忽略该问题,因为我平常编的程序都是比较小的程序,有异常就中断没什么影响,但是如果未来 我跟别人合作,编写一个模块的程序,如果每次我这个模块出现异常,整个程序就中断,那么后果不堪设想!

问题2:为了解释问题2,我们举一个例子。假如我要处理一个日志文件,里面的内容如下:

Jul 16 03:27:01 node69 sced[22053]: Connection from 
Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype 
Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype
Jul 16 03:27:11 node69 sced[23417]: Connection from 
Jul 16 03:27:11 node69 sced[23417]: Connection from 
Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype
Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype
Jul 16 03:27:20 node69 sced[23454]: Connection from 
Jul 16 03:27:20 node69 sced[23454]: Connection from

我的目标是提取每行字符串里面的sced这个名字,显然,使用python一句话即可:

s = line.split()[4].split('[')[0].strip(':')

这样做没错,但是日志文件通常会很多,比如一共有百万行的日志,而且可能会出现错误,比如空行,或者有些日志输出的只有一半的行,如下所示:

Jul 16 03:27:01 node69 sced[22053]: SSH: Server;Ltype
(空行)
Jul 16 03:27:11 node69 sced[23417]: Connection from 
Jul 16 03:27:11 node69 sced[23417]: Connection from 
Jul 16 03:27:11 (只有一半的行)
Jul 16 03:27:11 node69 sced[23417]: SSH: Server;Ltype

这样在处理的时候,就会抛出数组越界异常,同时程序中断,每次我遇到问题,总是自己思考怎么回事,但是 如果不知道异常的那一行什么样子,我自己思考总是花费很长时间!而且每次解决一个问题,下次再出现另一个 问题的时候,又要重复这个过程!如果我能一次从头到尾处理这些数据,遇到问题将问题的那行打印出来,然后 程序还能够不中断该多好!显然,异常语句就应运而生!,代码如下:

with open(fileName, 'r',encoding = 'utf-8' ,errors='ignore') as f:
 for line in f.readlines():
 try:
  s = line.split()[4]
  s = s.split('[')[0].strip(':')
  theDict[s] = 1 if theDict.get(s,-1) == -1 else theDict[s]+1 #先得到日志的程序名出现次数的字典
 except:
  logging.exception('文件--' + fileName+'--在解析句子--'+line+'--时出现异常') #exception代表打印时也会打印出系统错误提示语句
#  raise

一开始,我不知道会遇到什么异常的情况,就把异常打印出来,然后不抛出raise,如果你想要出现异常,后面的数据都不处理了,那就把raise注释去掉,我感觉raise就像程序中的return的作用。

我的目标是运行一次,把所有可能的没法处理的情况的行都打印出来,如上述的写法,就实现了这个功能,可见,异常处理的语句多么有用。

总结一下:

编程本质就是实现某个逻辑,但是你没法把逻辑的所有情况都考虑到,此时加上异常处理模块,将异常打印出来,这样就能在出现异常时将异常的数据提取处理,根据这些数据继续改进自己的程序的逻辑!

日志处理

说道日志处理,我最大的体会是我以前编程从来不用日志,每次都是cout、System.out.println或者print这种直接控制台输出语句调试程序,但是最近我研究的方向是日志处理,于是只能仔细看看为啥还需要日志。

比如我上面的代码,在except后面打印的是logging.exception,这行语句在运行时没啥区别,都会在控制台中显示对应的异常处理的那句话,但是在后期其作用就大了,因为日志除了打印功能外,有两个附加功能:

可以根据设定的等级打印对于日志输出语句

可以将日志写本地,为后期查找错误时使用

import logging
logging.basicConfig(level=logging.DEBUG) #这句话没次第一次运行时生效,修改必须重启Console

根据日志等级,我们就可以控制不同的等级的日志是否显示,还能控制日志存储的位置,这样在我们不在现场调试的时候,根据日志的显示结果就能够知道程序的异常情况,非常方便!

以上这篇python异常处理和日志处理方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python迭代器和生成器介绍
Mar 06 Python
Python语言实现获取主机名根据端口杀死进程
Mar 31 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
python 类对象和实例对象动态添加方法(分享)
Dec 31 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
Python enumerate函数遍历数据对象组合过程解析
Dec 11 Python
python实现的分层随机抽样案例
Feb 25 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 Python
详解Python中string模块除去Str还剩下什么
Nov 30 Python
python实现股票历史数据可视化分析案例
Jun 10 Python
python可视化之颜色映射详解
Sep 15 Python
Python 音频生成器的实现示例
Dec 24 #Python
Python concurrent.futures模块使用实例
Dec 24 #Python
Python hmac模块使用实例解析
Dec 24 #Python
Python hashlib模块实例使用详解
Dec 24 #Python
Python实现使用dir获取类的方法列表
Dec 24 #Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 #Python
Python中filter与lambda的结合使用详解
Dec 24 #Python
You might like
PHP 采集程序中常用的函数
2009/12/09 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP使用mysqli操作MySQL数据库的简单方法
2017/02/04 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
php魔法函数与魔法常量使用介绍
2017/07/23 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
关于图片验证码设计的思考
2007/01/29 Javascript
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
html文档中的location对象属性理解及常见的用法
2014/08/13 Javascript
js获取元素外链样式的方法
2015/01/27 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
JavaScript实现标题栏文字轮播效果代码
2015/10/24 Javascript
使用OpenLayers3 添加地图鼠标右键菜单
2015/12/29 Javascript
Jquery跨域获得Json的简单实例
2016/05/18 Javascript
JavaScript 中 avalon绑定属性总结
2016/10/19 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
vue webpack重写cookie路径的方法
2019/07/10 Javascript
JavaScript封装单向链表的示例代码
2020/09/17 Javascript
Python基于select实现的socket服务器
2016/04/13 Python
Python的面向对象编程方式学习笔记
2016/07/12 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
Python模块汇总(常用第三方库)
2019/10/07 Python
Pycharm学生免费专业版安装教程的方法步骤
2020/09/24 Python
用python批量下载apk
2020/12/29 Python
丝芙兰加拿大官方网站:SEPHORA加拿大
2018/11/20 全球购物
俄罗斯女装店:12storeez
2019/10/25 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
国庆促销活动总结
2014/08/29 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
普通党员个人整改措施
2014/10/27 职场文书
幼儿教师2014年度工作总结
2014/12/16 职场文书
幼儿园卫生保健制度
2015/08/05 职场文书
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
Python装饰器的练习题
2021/11/23 Python