python异常处理和日志处理方式
作者:冬之晓东 发布时间:2023-04-25 09:36:54
今天,总结一下最近编程使用的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
根据日志等级,我们就可以控制不同的等级的日志是否显示,还能控制日志存储的位置,这样在我们不在现场调试的时候,根据日志的显示结果就能够知道程序的异常情况,非常方便!
来源:https://blog.csdn.net/qq_19528953/article/details/79666708
猜你喜欢
- 有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情
- 301和302 Http状态有啥区别?301,302 都是HTTP状态的编码,都代表着某个URL发生了转移,不同之处在于:301 redir
- 在使用tensorflow时常常会使用到tf.reduce_*这类的函数,在此对一些常见的函数进行汇总1.tf.reduce_sumtf.r
- 在一个网站,大量数据的前后端交互,JSON是最好的传递数据方式了。在Django中,使用JSON传输数据,有两种方式,一种是使用Python
- 创意404页面的文章我们似乎已经出过两篇了,今天hongkiat又带来了60个创意404页面.相关404页面设计文章:国外404错误页面的创
- 在Intel的早期,Andy Grove遇到一个雇员 - 他建议公司在芯片的基础上开发个人计算机。AndyGrove疑问道“个人计算机能做什
- 一、this1.什么是thisthis 关键字在大部分语言中都是一个重要的存在,JS中自然不例外,其表达的意义丰富多样甚至有些复杂,深刻理解
- 各位大家好!很荣幸能在这里和大家聊聊!(*^__^*) 嘻嘻……此处省略488字,切入正题。关于网页设计这个行业,在中国来讲这个行业并不成熟
- 之前一直使用hdfs的命令进行hdfs操作,比如:hdfs dfs -ls /user/spark/hdfs dfs -get /user/
- 在实现爬虫任务时,经常需要将一些图片下载到本地当中。那么在python中除了通过open()函数,以二进制写入方式来下载图片以外,还有什么其
- 本文主要介绍的是Python高阶函数与装饰器函数的相关内容,分享给大家,下面话不多说了,来一起看看详细的介绍吧高阶函数1、可以使用函数对象作
- ThreadLocal在threading模块中,可以见得它是为我们的线程服务的。它的主要作用是存储当前线程的变量,各个线程之间的变量名是可
- 品牌是我们一直挂在嘴边的词语,视觉设计师们经常说到,公司的品牌该如何如何去设计?这个违背了我们的公司品牌!等等。之前我有谈过关于 品牌灵魂的
- insert into(列名) select 列名 from 表名 where 条件 --不创建表,只复制表数据 select 列名 int
- print函数的功能是打印图窗或保存为特定文件格式。语法print(filename,formattype)print(filename,f
- 字体大小CSS2规范根据长度——水平和垂直尺寸——来定义字体。这个长度为一个数值,前面可能带一个可选的加(+)或减(-)标记符。另外,该数值
- 本文实例为大家分享了Python smtplib发送邮件功能的具体代码,供大家参考,具体内容如下解决之前版本的问题,下面为最新版#!/usr
- 本文实例讲述了python网络编程之读取网站根目录的方法,分享给大家供大家参考。具体实现方法如下:import socket, sys po
- 在Python我们要判断一个文件对当前用户有没有读、写、执行权限,我们通常可以使用os.access函数来实现,比如:# 判断读权限os.a
- 在win10环境下搭建python3.5.2和tensorflow平台,供大家参考,具体内容如下操作步骤如下:1、官网(https://ww