Python错误与异常
1 异常和错误
1.1 错误和异常
从软件方面来说,错误是语法或者逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释。当程序的语法正确后,剩下的就是逻辑错误了,逻辑错误可能是由于不完整或者不合法的输入所致。当Python检测到一个错误时,解释器就会指出当前流无法继续执行下去,这就出现了异常。
对异常的描述是:它是因为程序出现了错误而在正常控制流以外采取的行为,这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。
第一个阶段是发生在一个异常条件后发生的,只要检测到错误并且意识到异常条件,解释器就会触发一个异常。解释器通知当前控制流有错误发生。异常就是错误发生的信号,当前流被打断,用来处理这个错误并采取相应的操作。这就是第二阶段。
对异常的处理发生在第二阶段,异常引发后,可以调用不同的操作,可以忽略错误,或是减轻问题的影响后设法继续执行,所有的这些操作都是代表一种继续,或是控制的分支。关键是程序员在错误发生时可以指示程序如何执行。
1.2 Python中的异常
- NameError:尝试访问一个未声明的变量
- ZeroDivisionError:除数为0
- SyntaxError:Python解释器语法错误
- IndexError:请求的索引超出序列范围
- KeyError:请求一个不存在的字典关键字
- IOError:输入/输出错误
- AttributeError:尝试访问未知的对象属性
1.3 检测和处理异常
异常可以通过try语句来检测,任何在try语句块中的代码都会被检测,检测有无异常发生。
try语句有两种主要的形式:try-except和try-finally语句。这两个语句是互斥的,只能使用其中的一个。一个try语句可以对应一个或多个except语句,但只能对应一个finally语句,或者是一个try-except-finally复合语句。
1.4 try-except语句
try-except语句(以及更复杂的形式)定义了进行异常监控的一段代码,并且提供了异常处理的机制。
常见的语法格式如下:
- try:
- try_suite #监控这里的异常
- except Exception[, reason]:
- except_suite #异常处理的代码
- 举例:
- >>> try:
- ... f = open('bla', 'r')
- ... except IOError, e:
- ... print 'could not open file', e
- ...
- could not open file [Errno 2] No such file or directory: 'bla'
程序运行时,解释器尝试执行try里面的语句块,如果代码块执行后没有发生错误,执行流会忽略except语句继续执行,当except语句所指定的异常发生后,保存下错误的原因,控制流立即跳转到对应的处理器(try子句的剩余语句将被忽略)。
1.5 带有多个except的try语句
可以把多个except语句连接在一起,处理一个try块中可能发生的多种异常。如下:
- try
- try_suite #监控这里的异常
- except Exception1 [, reason]:
- suite_for_exception_Exception1
- except Exception2 [, reason]:
- suite_for_exception_Exception2
首先执行try子句,如果没有错误,忽略所有的except从句继续执行,如果发生异常,解释器将在这一串处理器(except子句)中查找匹配的异常,如果找到对应的处理器,执行流将跳转到这里。
1.5 处理多个异常的except语句
可以在一个except子句里处理多个异常,except语句在处理多个异常时要求异常被放在一个元组里:
- except (Exception1, Exception2) [, reason]:
- suite_for_Exception1_and_Exception2
事实上except语句可以处理任意多个异常,前提只是他们放在一个元组里,如下:
- except (Exc1,[, Exc2 [, … ExcN]]) [, reason]:
- suite_for_exceptions_Excl_to_ExcN
1.6 捕获所有异常
异常是遵循继承结构的,Exception是在最顶层。
- try:
- ;
- except Exception. e:
- #error occurred, etc.
Python2.5,异常被迁移到了新式类上,启用了一个新的"所有的异常之母",这个类叫做BaseException,KeyboardInterrupt和SystemExit和Exception同级了。如果需要捕获所有的异常,格式如下:
- try:
- ;
- except BaseException, e:
- #error occurred, etc.
1.8 "异常参数"
异常也可以有参数,异常引发后会被传递给异常处理器。当异常被引发后参数是作为附加帮助信息传递给异常处理器的。标准内建异常提供至少一个参数,指示异常原因的一个字符串。添加异常参数的except扩展语法如下:
- except (Exception1, Exception2, …, ExceptionN), [, reason):
- suite_for_Exception1_to_ExceptionN_with_Argument
异常参数自身组成一个元组,并存储为类实例(异常类的实例)的属性。
- #!/usr/bin/env python
- def safe_float(obj):
- 'safa version of float()'
- try:
- retval = float(obj)
- except (ValueError, TypeError), diag:
- retval = str(diag)
- return retval
- def main():
- 'handle all the data processing'
- log = open('cardlog.txt', 'w')
- try:
- ccfile = open('carddata.txt', 'r')
- except IOError, e:
- log.write('no txns this month\n')
- log.close()
- return
- txns = ccfile.readlines()
- ccfile.close()
- total = 0.00
- log.write('account log:\n')
- for eachTxn in txns:
- result = safe_float(eachTxn)
- if isinstance(result, float):
- total += result
- log.write('data... processed\n')
- else:
- log.write('ignord: %s' % result)
- print '$%.2f (new balance)' % (total)
- log.close()
- if __name__ == '__main__':
- main()
1.9 else子句
在try范围内没有异常被检测到时,执行else子句。在else范围中的任何代码执行前,在try范围中的所有代码必须完全成功。
- try:
- ;
- except Exception. e:
- #error occurred, etc.
- else:
- ;
1.11 finally子句
finally子句是无论异常是否发生,是否捕捉都会执行的一段代码。语法示例如下:
- try:
- ;
- except Exception. e:
- #error occurred, etc.
- else:
- ;
1.12 try-except-else-finally语句
综合所有不同的可以处理异常的语法样式如下:
- try:
- try_suite
- except Exception1:
- suite_for_Exception1
- except (Exception2, Exception3, Exception4):
- suite_for_Exception2_3_and_4
- except Exception5, Argument5:
- suit_for_Exception5_plus_argument
- except (Exception6, Exception7), Argument67:
- suit_for_Exception6_and_Exception7_plus_argument
- except:
- suit_for_all_other_exceptions
- else:
- no_exceptions_detected_suits
- finally:
- always_execute_suite
2 上下文管理
2.1 with语句
with语句的目的在于从流程图中把try、except和finally关键字和资源分配释放相关的代码统统去掉。基本用法如下:
- with context_expr [as var]:
- with_suite
with仅能工作支持上下文管理协议的对象,下面是一些支持该协议的对象:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
用file来进行举例:
- >>> with open('/etc/passwd', 'r') as f:
- ... for eachLine in f:
- ... #do stuff with eachLine of f...
无论在这一段代码的开始、中间或结束发生异常,会执行清除的代码,此时文件仍会被自动的关闭。
3 触发异常
raise语句用于触发异常,一般语法如下:
raise [SomeException [, args [, traceback]]]
第一个参数,SomeException,是触发异常的名字,如果有,必须是一个字符串、类或实例。
第二个符号为可选的args(比如参数、值),来传给异常。可以是一个单独的对象也可以是一个对象的元组。当异常发生时,异常的参数总是作为一个元组传入。
最后一个参数traceback是可选的,如果有的话,则是当异常触发时新生成的一个用于异常-正常化的跟踪记录对象。
4 断言
断言是一句必须等价于布尔真的判断,此外当异常发生也意味着表达式为假。如果断言成功不采取任何措施,否则触发AssertionError(断言错误)的异常,语法如下:
assert expression [, arguments]
举例:
- >>> assert 1==1
- >>> assert 1==2
- Traceback (most recent call last):
- File "<stdin>", line 1, in <module>
- AssertionError
AssertionError(断言错误)的异常也可以使用try-except捕捉。
附录:python内建异常
异常名称 |
描述 |
BaseException |
所有异常的基类 |
SystemExit |
Python解释器请求退出 |
KeyboardInterrupt |
用户中断执行(通常是输入^C) |
Exception |
常规错误的基类 |
StopIteration |
迭代器没有更多的值 |
GeneratorExit |
生成器(generator)发生异常来通知退出 |
StandardError |
所有的内建标准异常的基类 |
ArithmeticError |
所有数值计算错误的基类 |
FloatingPointError |
浮点计算错误 |
OverflowError |
浮点运算超出最大限度 |
ZeroDivisionError |
除(或取模)零(所有数据类型) |
AssertionError |
断言语句失败 |
EOFError |
没有内建输入,到达EOF标记 |
EnvironmentError |
操作系统错误的基类 |
IOError |
输入/输出操作失败 |
OSError |
操作系统错误 |
WindowsError |
Windows系统调用失败 |
ImportError |
导入模块/对象失败 |
LookupError |
无效数据查询的基类 |
IndexError |
序列中没有此索引 |
KeyError |
映射中没有这个键 |
MemoryError |
内存溢出错误(对于Python解释器不是致命的) |
NameError |
为声明/初始化对象(没有属性) |
UnboundLocalError |
访问未初始化的本地变量 |
ReferenceError |
弱引用(Weak reference)试图访问已经回收了的对象 |
RuntimeError |
一般的运行时错误 |
NotImplementedError |
尚未实现的方法 |
SyntaxError |
Python语法错误 |
IndentationError |
缩进错误 |
TabError |
Tab和空格混用 |
SystemError |
一般解释器系统错误 |
TypeError |
对类型无效的操作 |
ValueError |
传入无效的参数 |
UnicodeError |
Unicode相关的错误 |
UnicodeDecodeError |
Unicode解码时的错误 |
UnicodeEncodeError |
Unicode编码时的错误 |
UnicodeTranslateError |
Unicode转换时错误 |
Warning |
警告的基类 |
DeprecationWarning |
关于被弃用的特征的警告 |
FutureWarning |
关于构造未来语义会有改变的警告 |
OverflowWarning |
旧的关于自动提升为长整型(long)的警告 |
PendingDepressionWarning |
关于特征将会被废弃的警告 |
RuntimeWarning |
可以的运行时行为的警告 |
SyntaxWarning |
可疑的语法的警告 |
UserWarning |
用户代码生成的警告 |
Python错误与异常的更多相关文章
- Python错误和异常概念(总)
转载请标明出处: http://www.cnblogs.com/why168888/p/6435956.html 本文出自:[Edwin博客园] Python错误和异常概念(总) 1. 错误和异常的处 ...
- Python - 错误和异常 - 第十九天
Python 错误和异常 作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和 ...
- Python错误和异常学习
一:错误解释 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 代码运行前的语法或者逻辑错误,语法错误在执行前修改,逻辑错误无法修改 二:异常 执行过程 ...
- 13.python错误和异常
一.错误和异常1.程序中的错误分为俩种:(1)语法错误:不按照语言的规则,必须在程序执行前就改正(2)逻辑错误2.异常就是程序运行时发生错误的信号,分为三部分(1)Traceback:异常追踪的信息( ...
- Python错误和异常 学习笔记
错误和异常概念 错误: 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行 1.程序遇到 ...
- Python 错误和异常
1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...
- python错误和异常
一:语法错误syntax errors 熟悉语法! 二:异常 ①打印错误信息时,异常的类型作为异常的内置名显示,并以调用栈的形式显示具体信息 ②常见的异常: ...
- Python 错误和异常小结[转]
原文链接 http://blog.csdn.net/sinchb/article/details/8392827 事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Pyth ...
- Python 错误和异常小结
1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...
随机推荐
- maven仓库总结,maven私服搭建,批量mvn eclipse:eclipse
配置pom.xml依赖包时在这里找包的描述: http://search.maven.org/#browse 以java为根目录. mvn archtype:generate -DgroupId=zt ...
- 原生js重写each方法
js原生有个for-each方法,但是只能遍历数组不能遍历对象; jq有个$.each倒是可以遍历数组和对象,但是项目中如果不想用jq呢,我们就用原生来写一个吧. [12,23,34].forEach ...
- 网摘-获取屏幕dc并且将其画面显示在窗体中
获取屏幕dc并且将其画面显示在窗体中 HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND. HDC hScreenDC = ::GetDC(hWnd); // ...
- linux包之下载curl-wget
[root@localhost ~]# rpm -qa|grep curllibcurl-7.19.7-37.el6_4.x86_64python-pycurl-7.19.0-8.el6.x86_64 ...
- HP Z420 工作站主板(X79 , C602)折腾笔记
公司的电脑有点慢,然后最近运行了SQL Server服务之后,内存又不太够.于是就在淘宝上搜索一些洋垃圾相关的信息.找来找去,发现X79是不错的选择,CPU性能够用,内存价格便宜(16G不到200元) ...
- 微信小程序酒店日历超强功能
首先利用date拿到年月日 月记得+1 ,因为是从0开始的 先遍历月份,跨年年+1 ,月归至1: 然后遍历天数, lastDat = new Date(val.year,val.month,0).ge ...
- 前端——CSS选择器
目录 前端CSS CSS三种引入方式 CSS标签选择器 基本选择器 1.元素选择器 2.类选择器 3.id选择器 4.通用选择器 组合选择器 1.后代选择器 空格 2.儿子选择器 > 3.毗邻选 ...
- 关于python2和python3除法的区别
在Python2中,除法的取值结果取整数 >>> 9/2 4 而在Python3中,除法/的结果包含小数,如果只想取整数需要使用// >>> 9/2 4.5 > ...
- 【时区问题】SpringBoot+mybatis查询mysql的datetime类型数据时间差14小时
[时区问题]MyBatis查询MySQL的datetime类型数据时间差14小时 故障解决方式 与数据库连接时,定义时区,避免mybatis框架从mysql获取时区.在连接上加上 serverTime ...
- ELK学习实验007:Nginx的日志分析系统之Metribeat配置
一 Metricbeat 简介 1.1 系统级监控,更简洁将 Metricbeat 部署到您的所有 Linux.Windows 和 Mac 主机,并将它连接到 Elasticsearch 就大功告成了 ...