异常处理

什么是异常?什么是错误?

1,程序中难免出现错误。

错误主要分为两种:

  1,语法错误

    语法错误是根本上的错误,无法通过PYTHON解释器。完全无法执行,是在程序中不应该出现的错误。无法进行异常处理。

  2,逻辑错误

    是对编程的逻辑存在一定的认知不足,需要重新构思逻辑。这一类大多是python做不到的事。可以进行异常处理。

 1 AttributeError 试图访问一个对象没有的树形,比如foo.x,但是foo没有属性x
 2 IOError 输入/输出异常;基本上是无法打开文件
 3 ImportError 无法引入模块或包;基本上是路径问题或名称错误
 4 IndentationError 语法错误(的子类) ;代码没有正确对齐
 5 IndexError 下标索引超出序列边界,比如当x只有三个元素,却试图访问x[5]
 6 KeyError 试图访问字典里不存在的键
 7 KeyboardInterrupt Ctrl+C被按下
 8 NameError 使用一个还未被赋予对象的变量
 9 SyntaxError Python代码非法,代码不能编译(个人认为这是语法错误,写错了)
10 TypeError 传入对象类型与要求的不符合
11 UnboundLocalError 试图访问一个还未被设置的局部变量,基本上是由于另有一个同名的全局变量,
12 导致你以为正在访问它
13 ValueError 传入一个调用者不期望的值,即使值的类型是正确的

常用语法异常

 1 ArithmeticError
 2 AssertionError
 3 AttributeError
 4 BaseException
 5 BufferError
 6 BytesWarning
 7 DeprecationWarning
 8 EnvironmentError
 9 EOFError
10 Exception
11 FloatingPointError
12 FutureWarning
13 GeneratorExit
14 ImportError
15 ImportWarning
16 IndentationError
17 IndexError
18 IOError
19 KeyboardInterrupt
20 KeyError
21 LookupError
22 MemoryError
23 NameError
24 NotImplementedError
25 OSError
26 OverflowError
27 PendingDeprecationWarning
28 ReferenceError
29 RuntimeError
30 RuntimeWarning
31 StandardError
32 StopIteration
33 SyntaxError
34 SyntaxWarning
35 SystemError
36 SystemExit
37 TabError
38 TypeError
39 UnboundLocalError
40 UnicodeDecodeError
41 UnicodeEncodeError
42 UnicodeError
43 UnicodeTranslateError
44 UnicodeWarning
45 UserWarning
46 ValueError
47 Warning
48 ZeroDivisionError

所有异常类型

代码异常后会发生什么?

代码停止执行,进行报错提示。除了finally语句中的代码,全都不执行。

什么是异常处理?

python解释器检测到错误,触发异常(也允许程序员自己触发异常)

程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)

如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

为什么要进行异常处理?

python解析器去执行程序,检测到了一个错误时,触发异常,异常触发后且没被处理的情况下,程序就在当前异常处终止,后面的代码不会运行,谁会去用一个运行着突然就崩溃的软件。

所以你必须提供一种异常处理机制来增强你程序的健壮性与容错性

如何进行异常处理?

首先须知,异常是由程序的错误引起的,语法上的错误跟异常处理无关,必须在程序运行前就修正

1,我们常见的if语句判断输入的数据的组成就是一种异常处理。

(欠一段代码)

2,python为每一种异常定制了一个类型,然后提供了一种特定的语法结构用来进行异常处理

  1,基本语法

    try:

        被检测的代码块

    except 异常类型:

        try中一旦检测到异常,就执行这个位置的逻辑。

  2,异常类只能用来处理指定的异常情况,如果是非指定异常则无法处理。

    当报错的类型是异常处理中没有指定的异常。则不拦截错误,直接报错。

  3,多分支

1 s1 = 'hello'
2 try:
3     int(s1)
4 except IndexError as e:
5     print(e)
6 except KeyError as e:
7     print(e)
8 except ValueError as e:
9     print(e)

多分支的创建方式。

  4,万能异常

 1 s1 = 'hello'
 2 try:
 3     int(s1)
 4 except Exception as e: #万能异常Exception,可以捕获所有的异常。
 5     print(e)
 6
 7 关于万能异常:
 8     由于万能异常可以捕获所有的错误,所以有以下特点。
 9         1,在异常处理分支中,Exception下面的异常分支无法运行。
10         2,如果不将错误信息赋值,便无法查看错误信息。在调试程序时非常的
11            不便于调试。    

View Code

异常的其他组成

finally语句

 1 s1 = 'hello'
 2 try:
 3     int(s1)
 4 except IndexError as e:
 5     print(e)
 6 except KeyError as e:
 7     print(e)
 8 except ValueError as e:
 9     print(e)
10 #except Exception as e:
11 #    print(e)
12
13 e是except收集的错误信息,可以通过调用查看作物信息,常在Exception中使用。
14
15 else:
16     print('try内代码块没有异常则执行我')
17 finally:
18     print('无论异常与否,都会执行该模块,通常是进行清理工作')

finally语句

主动触发异常

1 try:
2     raise TypeError('类型错误')
3 except Exception as e:
4     print(e)

主动触发异常

自定义异常

 1 class EvaException(BaseException):
 2     def __init__(self,msg):
 3         self.msg=msg
 4     def __str__(self):
 5         return self.msg
 6
 7 try:
 8     raise EvaException('类型错误')
 9 except EvaException as e:
10     print(e)

自定义异常

断言

1 # assert 条件
2
3 assert 1 == 1
4
5 assert 1 == 2

try..except这种异常处理机制就是取代if那种方式,让你的程序在不牺牲可读性的前提下增强健壮性和容错性

异常处理中为每一个异常定制了异常类型(python中统一了类与类型,类型即类),对于同一种异常,一个except就可以捕捉到,可以同时处理多段代码的异常(无需‘写多个if判断式’)减少了代码,增强了可读性

使用try..except的方式

1:把错误处理和真正的工作分开来
2:代码更易组织,更清晰,复杂的工作任务更容易实现;
3:毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;

什么时候使用异常处理?

try...except应该尽量少用,因为它本身就是你附加给你的程序的一种异常处理的逻辑,与你的主要的工作是没有关系的
这种东西加的多了,会导致你的代码可读性变差,只有在有些异常无法预知的情况下,才应该加上try...except,其他的逻辑错误应该尽量修正

异常的继承关系

    

 1 BaseException
 2  +-- SystemExit
 3  +-- KeyboardInterrupt
 4  +-- GeneratorExit
 5  +-- Exception
 6       +-- StopIteration
 7       +-- StandardError
 8       |    +-- BufferError
 9       |    +-- ArithmeticError
10       |    |    +-- FloatingPointError
11       |    |    +-- OverflowError
12       |    |    +-- ZeroDivisionError
13       |    +-- AssertionError
14       |    +-- AttributeError
15       |    +-- EnvironmentError
16       |    |    +-- IOError
17       |    |    +-- OSError
18       |    |         +-- WindowsError (Windows)
19       |    |         +-- VMSError (VMS)
20       |    +-- EOFError
21       |    +-- ImportError
22       |    +-- LookupError
23       |    |    +-- IndexError
24       |    |    +-- KeyError
25       |    +-- MemoryError
26       |    +-- NameError
27       |    |    +-- UnboundLocalError
28       |    +-- ReferenceError
29       |    +-- RuntimeError
30       |    |    +-- NotImplementedError
31       |    +-- SyntaxError
32       |    |    +-- IndentationError
33       |    |         +-- TabError
34       |    +-- SystemError
35       |    +-- TypeError
36       |    +-- ValueError
37       |         +-- UnicodeError
38       |              +-- UnicodeDecodeError
39       |              +-- UnicodeEncodeError
40       |              +-- UnicodeTranslateError
41       +-- Warning
42            +-- DeprecationWarning
43            +-- PendingDeprecationWarning
44            +-- RuntimeWarning
45            +-- SyntaxWarning
46            +-- UserWarning
47            +-- FutureWarning
48        +-- ImportWarning
49        +-- UnicodeWarning
50        +-- BytesWarning

异常的继承关系

logging模块

函数式简单配置

1 import logging
2
3 logging.debug('debug message')
4 logging.info('info message')
5 logging.warning('warning message')
6 logging.error('error message')
7 logging.critical('critical message') 

默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志,这说明默认的日志级别设置为WARNING(日志级别等级CRITICAL > ERROR > WARNING > INFO > DEBUG),默认的日志格式为日志级别:Logger名称:用户输出消息。

灵活配置日志级别,日志格式,输出位置:

 1 import logging
 2 logging.basicConfig(level=logging.DEBUG,
 3                     format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
 4                     datefmt='%a, %d %b %Y %H:%M:%S',
 5                     filename='/tmp/test.log',
 6                     filemode='w')
 7
 8 logging.debug('debug message')
 9 logging.info('info message')
10 logging.warning('warning message')
11 logging.error('error message')
12 logging.critical('critical message')

配置参数:

 1 logging.basicConfig()函数中可通过具体参数来更改logging模块默认行为,可用参数有:
 2
 3 filename:用指定的文件名创建FiledHandler,这样日志会被存储在指定的文件中。
 4 filemode:文件打开方式,在指定了filename时使用这个参数,默认值为“a”还可指定为“w”。
 5 format:指定handler使用的日志显示格式。
 6 datefmt:指定日期时间格式。
 7 level:设置rootlogger(后边会讲解具体概念)的日志级别
 8 stream:用指定的stream创建StreamHandler。可以指定输出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默认为sys.stderr。若同时列出了filename和stream两个参数,则stream参数会被忽略。
 9
10 format参数中可能用到的格式化串:
11 %(name)s Logger的名字
12 %(levelno)s 数字形式的日志级别
13 %(levelname)s 文本形式的日志级别
14 %(pathname)s 调用日志输出函数的模块的完整路径名,可能没有
15 %(filename)s 调用日志输出函数的模块的文件名
16 %(module)s 调用日志输出函数的模块名
17 %(funcName)s 调用日志输出函数的函数名
18 %(lineno)d 调用日志输出函数的语句所在的代码行
19 %(created)f 当前时间,用UNIX标准的表示时间的浮 点数表示
20 %(relativeCreated)d 输出日志信息时的,自Logger创建以 来的毫秒数
21 %(asctime)s 字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
22 %(thread)d 线程ID。可能没有
23 %(threadName)s 线程名。可能没有
24 %(process)d 进程ID。可能没有
25 %(message)s用户输出的消息

配置参数

logger对象配置

 1 import logging
 2
 3 logger = logging.getLogger()
 4 # 创建一个handler,用于写入日志文件
 5 fh = logging.FileHandler('test.log',encoding='utf-8')
 6
 7 # 再创建一个handler,用于输出到控制台
 8 ch = logging.StreamHandler()
 9 formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
10 fh.setLevel(logging.DEBUG)
11
12 fh.setFormatter(formatter)
13 ch.setFormatter(formatter)
14 logger.addHandler(fh) #logger对象可以添加多个fh和ch对象
15 logger.addHandler(ch)
16
17 logger.debug('logger debug message')
18 logger.info('logger info message')
19 logger.warning('logger warning message')
20 logger.error('logger error message')
21 logger.critical('logger critical message')

logging库提供了多个组件:Logger、Handler、Filter、Formatter。Logger对象提供应用程序可直接使用的接口,Handler发送日志到适当的目的地,Filter提供了过滤日志信息的方法,Formatter指定日志显示格式。另外,可以通过:logger.setLevel(logging.Debug)设置级别,当然,也可以通过

fh.setLevel(logging.Debug)单对文件流设置某个级别。

转载于:https://www.cnblogs.com/heimajia/p/10662974.html

python学习第25天相关推荐

  1. Python学习day5作业-ATM和购物商城

    Python学习day5作业 Python学习day5作业 ATM和购物商城 作业需求 ATM: 指定最大透支额度 可取款 定期还款(每月指定日期还款,如15号) 可存款 定期出账单 支持多用户登陆, ...

  2. Python学习系列(六)(模块)

    Python学习系列(六)(模块) Python学习系列(五)(文件操作及其字典) 一,模块的基本介绍 1,import引入其他标准模块 标准库:Python标准安装包里的模块. 引入模块的几种方式: ...

  3. 最新Python学习项目Top10!

    作者 | Mybridge 译者 | Linstancy 整理 | Jane 出品 | AI科技大本营 [导读]过去一个月里,我们对近1000个Python 学习项目进行了排名,并挑选出热度前10的项 ...

  4. Python学习系列(五)(文件操作及其字典)

    Python学习系列(五)(文件操作及其字典) Python学习系列(四)(列表及其函数) 一.文件操作 1,读文件      在以'r'读模式打开文件以后可以调用read函数一次性将文件内容全部读出 ...

  5. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  6. Python学习教程(Python学习路线):Python面试100题(二)

    Python学习教程(Python学习路线):面试题接着给大家整理! 16.<div class="nam">中国</div>,用正则匹配出标签里面的内容( ...

  7. python 学习笔记 12 -- 写一个脚本获取城市天气信息

    近期在玩树莓派,前面写过一篇在树莓派上使用1602液晶显示屏,那么可以显示后最重要的就是显示什么的问题了. 最easy想到的就是显示时间啊,CPU利用率啊.IP地址之类的.那么我认为呢,假设可以显示当 ...

  8. 自学python推荐书籍同时找哪些来实践-Python学习路上有这些论坛、网站、书籍与你同行...

    Python学习路上有这些论坛.网站.书籍与你同行 2019-05-03 18:24:41 613点赞 9508收藏 164评论 创作立场声明:希望我的一些经验可以给你少走一些弯路,但人总得走点弯路才 ...

  9. python学习手册条件-Python学习手册(第4版)pdf

    Python学习手册(第4版) 内容简介 <Python学习手册(第4版)>学习Python的主要内建对象类型:数字.列表和字典.使用Python语句创建和处理对象,并且学习Python的 ...

最新文章

  1. flask-admin 快速打造博客 系列一
  2. UVA 141 The Spot Game
  3. python基础教程:多态、多继承、函数重写、迭代器详细教程
  4. Spring 3.0 注解注入详解
  5. boost::mp11::mp_at相关用法的测试程序
  6. python scatter参数详解_python matplotlib.scatter 用法
  7. linux微信公众号报警,zabbix报警媒介,微信报警,邮件报警
  8. centos6.8 环境一键安装包 nginx配置thinkphp5
  9. FireBug 调试JS入门 —如何调试JS
  10. python的方向_Python Shell下方向键显示「^[[C^[[D」修复方法
  11. 转 ---《协程小结》
  12. 洛谷 P1509 找啊找啊找GF(复习二维费用背包)
  13. stm32系统时钟配置,标准库v3.5
  14. 电脑网易云音乐,我放弃了QQ音乐和网易云音乐,最终还是选择了Apple Music
  15. 威纶通触摸屏直接与台达变频器进行MODBUS RTU通信的具体方法(图文)
  16. spacy词性标注解释【dep、pos、tag】
  17. 苹果Macbook电脑无法进入系统
  18. RN如何使用原生的AndroidUI组件
  19. wnmp的php会自动挂掉,初探wnmp php
  20. git 常用的命令行

热门文章

  1. java a =a-=aa_java 初学 :求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字。几个 数相加由键盘控制。...
  2. git工作区状态(2)
  3. 深度优先遍历(DFS)- Letter CasePermutation - Combinations
  4. bzoj 3384: [Usaco2004 Nov]Apple Catching 接苹果(DP)
  5. Wannafly挑战赛9: D. 造一造(组合数)
  6. 51nod 1574: 排列转换
  7. jquery中serialize()序列化函数
  8. 电压的单位dBuV,dBmV和dBV以及dBu和dB的转化关系
  9. 动态RAM的刷新(资料来源于网上自己查找搜索)
  10. Bind variables in 'in' condition(在in中动态的绑定参数(参数个数可变))