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使用wxPython打开并播放wav文件的方法
Apr 24 Python
独特的python循环语句
Nov 20 Python
Python简单的制作图片验证码实例
May 31 Python
Python PyAutoGUI模块控制鼠标和键盘实现自动化任务详解
Sep 04 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
python BlockingScheduler定时任务及其他方式的实现
Sep 19 Python
如何基于windows实现python定时爬虫
May 01 Python
基于django 的orm中非主键自增的实现方式
May 18 Python
如何使用python写截屏小工具
Sep 29 Python
pandas按照列的值排序(某一列或者多列)
Dec 13 Python
简述python四种分词工具,盘点哪个更好用?
Apr 13 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 动态随机生成验证码类代码
2010/04/09 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
2014/06/12 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
yii框架结合charjs实现统计30天数据的方法
2020/04/04 PHP
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
基于jquery实现的银行卡号每隔4位自动插入空格的实现代码
2016/11/22 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
VUE2 前端实现 静态二级省市联动选择select的示例
2018/02/09 Javascript
electron制作仿制qq聊天界面的示例代码
2018/11/26 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
vue结合el-upload实现腾讯云视频上传功能
2020/07/01 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
2020/11/05 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
python使用7z解压apk包的方法
2015/04/18 Python
Pycharm学习教程(1) 定制外观
2017/05/02 Python
python中的计时器timeit的使用方法
2017/10/20 Python
对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
2018/06/28 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
2019/12/04 Python
html5 浏览器支持 如何让所有的浏览器都支持HTML5标签样式
2012/12/07 HTML / CSS
会计毕业生求职简历的自我评价
2013/10/20 职场文书
电气工程师岗位职责
2014/01/01 职场文书
大一学生的职业生涯规划书范文
2014/01/19 职场文书
农业项目投资意向书
2015/05/09 职场文书
Mysql 数据库中的 redo log 和 binlog 写入策略
2022/04/26 MySQL
volatile保证可见性及重排序方法
2022/08/05 Java/Android
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang