1 异常和错误

1.1 错误和异常

从软件方面来说,错误是语法或者逻辑上的,语法错误指示软件的结构上有错误,导致不能被解释器解释。当程序的语法正确后,剩下的就是逻辑错误了,逻辑错误可能是由于不完整或者不合法的输入所致。当Python检测到一个错误时,解释器就会指出当前流无法继续执行下去,这就出现了异常。

对异常的描述是:它是因为程序出现了错误而在正常控制流以外采取的行为,这个行为又分为两个阶段:首先是引起异常发生的错误,然后是检测(和采取可能的措施)阶段。

第一个阶段是发生在一个异常条件后发生的,只要检测到错误并且意识到异常条件,解释器就会触发一个异常。解释器通知当前控制流有错误发生。异常就是错误发生的信号,当前流被打断,用来处理这个错误并采取相应的操作。这就是第二阶段。

对异常的处理发生在第二阶段,异常引发后,可以调用不同的操作,可以忽略错误,或是减轻问题的影响后设法继续执行,所有的这些操作都是代表一种继续,或是控制的分支。关键是程序员在错误发生时可以指示程序如何执行。

1.2 Python中的异常

  1. NameError:尝试访问一个未声明的变量
  2. ZeroDivisionError:除数为0
  3. SyntaxError:Python解释器语法错误
  4. IndexError:请求的索引超出序列范围
  5. KeyError:请求一个不存在的字典关键字
  6. IOError:输入/输出错误
  7. 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错误与异常的更多相关文章

  1. Python错误和异常概念(总)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6435956.html 本文出自:[Edwin博客园] Python错误和异常概念(总) 1. 错误和异常的处 ...

  2. Python - 错误和异常 - 第十九天

    Python 错误和异常 作为 Python 初学者,在刚学习 Python 编程时,经常会看到一些报错信息,在前面我们没有提及,这章节我们会专门介绍. Python 有两种错误很容易辨认:语法错误和 ...

  3. Python错误和异常学习

    一:错误解释 1.语法错误:代码不符合解释器或者编译器语法 2.逻辑错误:不完整或者不合法输入或者计算出现问题 代码运行前的语法或者逻辑错误,语法错误在执行前修改,逻辑错误无法修改 二:异常 执行过程 ...

  4. 13.python错误和异常

    一.错误和异常1.程序中的错误分为俩种:(1)语法错误:不按照语言的规则,必须在程序执行前就改正(2)逻辑错误2.异常就是程序运行时发生错误的信号,分为三部分(1)Traceback:异常追踪的信息( ...

  5. Python错误和异常 学习笔记

    错误和异常概念 错误:     1.语法错误:代码不符合解释器或者编译器语法     2.逻辑错误:不完整或者不合法输入或者计算出现问题 异常:执行过程中出现万体导致程序无法执行     1.程序遇到 ...

  6. Python 错误和异常

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...

  7. python错误和异常

    一:语法错误syntax errors        熟悉语法! 二:异常 ①打印错误信息时,异常的类型作为异常的内置名显示,并以调用栈的形式显示具体信息    ②常见的异常:             ...

  8. Python 错误和异常小结[转]

    原文链接    http://blog.csdn.net/sinchb/article/details/8392827 事先说明哦,这不是一篇关于Python异常的全面介绍的文章,这只是在学习Pyth ...

  9. Python 错误和异常小结

    1.Python异常类 Python是面向对象语言,所以程序抛出的异常也是类.常见的Python异常有以下几个,大家只要大致扫一眼,有个映像,等到编程的时候,相信大家肯定会不只一次跟他们照面(除非你不 ...

随机推荐

  1. 2019-3-1-C#-double-好用的扩展

    title author date CreateTime categories C# double 好用的扩展 lindexi 2019-3-1 9:19:5 +0800 2018-05-15 10: ...

  2. vue-learning:20 - js - 区别:filters / data / computed / watch / methods

    区别:filters / data / computed / watch / methods 在配置对象options中,filters/data/computed/watch/methods的每一项 ...

  3. dotnet 删除只读文件

    如果直接通过 File.Delete 删除只读文件会出现没有权限提示,可以先设置文件不是只读然后删除文件 try { File.Delete(file); } catch (UnauthorizedA ...

  4. Python7_内置函数总结

    Python Built-In 函数: str(obj) :输入(对象),返回一个对象的string格式: isinstance(object,classinfo):判断一个对象是否是一个已知的类型, ...

  5. 在linux下find和grep

    在linux下面工作,有些命令能够大大提高效率.本文就向大家介绍find.grep命令,他哥俩可以算是必会的linux命令,我几乎每天都要用到他们.本文结构如下: find命令 find命令的一般形式 ...

  6. Python中的[...]是什么?

    ...就是好几个冒号 array[...] 就是array[:,:,:]

  7. Java并发编程系列-(8) JMM和底层实现原理

    8. JMM和底层实现原理 8.1 线程间的通信与同步 线程之间的通信 线程的通信是指线程之间以何种机制来交换信息.在编程中,线程之间的通信机制有两种,共享内存和消息传递. 在共享内存的并发模型里,线 ...

  8. VS2017+QT5.11.2+SeetaFace1.0/SeetaFace2.0的简单实现

    SeetaFace开源引擎GitHub地址:https://github.com/seetaface/SeetaFaceEngine SeetaFace2开源引擎GitHub地址:https://gi ...

  9. 经典问题(c++/python)素数、杨辉三角(金字塔型)、统计单词数、简单计算器、密码安全程度、凯撒密码加密、汉诺塔 (python课设实验实例)-- biaobiao88

    [编写程序,输人一个大于2的自然数,然后输出小于该数字的所有素数组成的列表.]所谓素数,是指除了1和自身之外没有其他因数的自然数,最小的素数是2,后面依次是3.5.7.11.13... c++代码: ...

  10. appium+android自动化测试环境部署

    1 node.js安装 官网(https://nodejs.org/en/) 下载对应版本的node.js并安装 安装完成后cmd中输入node -v,输入版本号则安装成功 2 jdk安装 下载对应版 ...