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

今天,总结一下最近编程使用的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异常处理和日志处理方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Python使用try except处理程序异常的三种常用方法分析

    本文实例讲述了Python使用try except处理程序异常的三种常用方法.分享给大家供大家参考,具体如下: 如果你在写python程序时遇到异常后想进行如下处理的话,一般用try来处理异常,假设有下面的一段程序: try: 语句1 语句2 . . 语句N except .........: do something ....... 但是你并不知道"语句1至语句N"在执行会出什么样的异常,但你还要做异常处理,且想把出现的异常打印出来,并不停止程序的运行,所以在"except

  • python try 异常处理(史上最全)

    在程序出现bug时一般不会将错误信息显示给用户,而是现实一个提示的页面,通俗来说就是不让用户看见大黄页!!! 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止. 为了处理异常,我们使用try...except 把可能发生错误的语句放在try模块里,用except来处理异常. except可以处理一个专门的异常,也可以处理一组圆括号中的异常, 如果except后没有指定异常,则默认处理所有的异常. 每一个try,都必须至少有一个except 在python的异常中,有一个万能异常:Exc

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

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

  • 详解python之配置日志的几种方式

    作为开发者,我们可以通过以下3中方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件,然后使用fileConfig()函数来读取该文件的内容: 3)创建一个包含配置信息的dict,然后把它传递个dictConfig()函数: 需要说明的是,logging.basicConfig()也属于第一种方式,它只是对loggers, handlers和formatters的配置函数进行了封

  • 详解Python中的日志模块logging

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cpp,而在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用.且功能强大的日志模块:logging.logging模块支持将日志信息保存到不同的目标域中,如:保存到日志文件中:以邮件的形式发送日志信息:以http get或post的方式提交日志到web服务器:以windows事

  • 深入理解Python异常处理的哲学

    所谓异常指的是程序的执行出现了非预期行为,就好比现实中的做一件事过程中总会出现一些意外的事.异常的处理是跨越编程语言的,和具体的编程细节相比,程序执行异常的处理更像是哲学.限于认知能力和经验所限,不可能达到像解释器下import this看到的python设计之禅一样,本文就结合实际使用简单的聊一聊. 0. 前言 工作中,程序员之间一言不合就亮代码,毕竟不管是代码本身还是其执行过程,不会存在二义性,更不会含糊不清,代码可谓是程序员之间的官方语言.但是其处理问题的逻辑或者算法则并非如此. 让我至今

  • 对于Python异常处理慎用“except:pass”建议

    翻译自StackOverflow中一个关于Python异常处理的问答. 问题:为什么"except:pass"是一个不好的编程习惯? 我时常在StackOverflow上看到有人评论关于except: pass的使用,他们都提到这是一个不好的Python编程习惯,应该避免.可我想知道为什么?有时候我并不在意出现的错误,而是只想让我的程序继续进行下去.就像这样: try: something except: pass 为什么这么使用except:pass不好?这背后的原因是什么,是不是因

  • 基于Python log 的正确打开方式

    保存代码到文件:logger.py import os import logbook from logbook.more import ColorizedStderrHandler import smtplib LOG_DIR = os.path.join('log') if not os.path.exists(LOG_DIR): os.makedirs(LOG_DIR) def get_logger(name='test', file_log=False): logbook.set_date

  • python实现log日志的示例代码

    源代码: # coding=utf-8 import logging import os import time LEVELS={'debug':logging.DEBUG,\ 'info':logging.INFO,\ 'warning':logging.WARNING,\ 'error':logging.ERROR,\ 'critical':logging.CRITICAL,} logger=logging.getLogger() level='default' def createFile

  • Python异常处理操作实例详解

    本文实例讲述了Python异常处理操作.分享给大家供大家参考,具体如下: 一.异常处理的引入 >>>whileTrue: try: x = int(input("Please enter a number: ")) break exceptValueError: print("Oops! That was no valid number. Try again ") Please enter a number: y Oops!That was no

  • 使用Filter过滤python中的日志输出的实现方法

    事情是这样的,我写了一个tornado的服务,过程当中我用logging记录一些内容,由于一开始并没有仔细观察tornado自已的日志管理,所以我就一般用debug来记录普通日志,error记录有问题的日志,但是当服务跑起来以后才发现,tornado的访问日志的级别是info,也就是20,debug是10的,所以如果我定义了日志的级别是debug,那么默认情况下肯定也会输出到日志文件中的. 但是我现在并不关心访问日志,而且由于我这个服务可能每时每刻都会有访问,这样在我对日志信息进行搜索的时候就会

  • Laravel 5.5 异常处理 & 错误日志的解决

    简介 Laravel 默认已经为我们配置好了错误和异常处理,我们在 App\Exceptions\Handler 类中触发异常并将响应返回给用户. 此外,Laravel 还集成了 Monolog 日志库以便提供各种功能强大的日志处理器,默认情况下,Laravel 已经为我们配置了一些处理器,我们可以选择单个日志文件,也可以选择记录错误信息到系统日志. 配置 调试模式 配置文件 config/app.php 中的 debug 配置项表示是否开启调试模式,调试模式下会将错误信息直接暴露给客户端. 默

随机推荐