错误和异常
错误和异常在程序设计中是两个不同的概念。这两个概念又有着密切联系。
错误是客观存在的一个现象。错误就在那里,不声不响。
错误分为语法错误和逻辑错误。
语法错误是静态的,编译/解释程序会发现这些语法错误,并辅助我们纠正这些语法错误。
逻辑错误动态的,是运算逻辑不完整不正确,会导致程序运行失败。
异常是一种手段措施,是系统发现程序运行出错后,为避免程序失败,中断正常控制流程并采取的措施。这个措施分为两个阶段:首先发布错误信息(抛出异常),其次处理这个错误并采取相应的操作。
在Python语言中所说异常还表示异常对象,就是将错误发生时的状态信息封装为一个对象。我们所谓抛出异常就是生成这个异常对象并让这个对象能被访问。异常对象一般是由系统抛出,但也可以由程序主动抛出。
try- except 语句:
try:
normal code piece # 系统会监控这段代码是否有错误发生,如果有会抛出相应的异常对象。
exceptException[, reason]: #程序可以捕获指定异常对象并做进一步的处理。
except code piece # 捕获异常后的处理代码。
说明:
reason将会是一个包含来自导致异常的代码的诊断信息的类实例. 异常参数自身会组成一个元组,并存储为类实例(异常类的实例)的属性. 上边的第一种用法中, reason 将会是一个Exception 类的实例. 对于大多内建异常, 也就是从 StandardError 派生的异常, 这个元组只包含一个指示错误原因的字符串. 一般说来, 异常的名字已经是一个满意的线索了, 但这个错误字符串会提供更多的信息. 操作系统或其他环境类型的错误, 例如 IOError , 元组中会把操作系统的错误编号放在错误字符串前. 无论 reason 只包含一个字符串或是由错误编号和字符串组成的元组, 调用 str(reason) 总会返回一个良好可读的错误原因. 不要忘记 reason 是一个类实例 - 这样做你其实是调用类的特殊方法 __str__() . 我们将在第 13 章探索面向对象编程中的这些特殊方法. 唯一的问题就是某些第三方或是其他外部库并不遵循这个标准协议. 我们推荐你在引发你自己的异常时遵循这个标准(参见核心风格笔记).
扩展支持:
1. 多个excption子句依次捕获不同的异常。
except ValueError:
retval = 'could not convert non-number tofloat'
except TypeError:
retval = 'object type cannot be convertedto float'
2. 一个exception子句中捕获多个不同的异常。要求异常被放在一个元组里:
except (Exception1, Exception2)[, reason]:
3. 捕获所有异常:
except Exception, e: 或者 except: (裸except子句)
4. else子句当没有异常发生时运行。
5. finally子句无论如何都会被运行。
完整的异常处理的语法模板:
try:
try_suite
except Exception1:
suite_for_Exception1
except (Exception2,Exception3, Exception4):
suite_for_Exceptions_2_3_and_4
except Exception5,Argument5:
suite_for_Exception5_plus_argument
except (Exception6,Exception7), Argument67:
suite_for_Exceptions6_and_7_plus_argument
except:
suite_for_all_other_exceptions
else:
no_exceptions_detected_suite
finally:
always_execute_suite
主动抛出异常:
raise[SomeException [, args [, traceback]]], 参数说明如下:
第一个参数,SomeExcpetion,是触发异常的名字.如果有,它必须是一个字符串,类或实例.
第二个符号为可选的 args(比如参数,值),来传给异常.这可以是一个单独的对象也可以是一个对象的元组.当异常发生时,异常的参数总是作为一个元组传入.如果 args 原本就是元组,那么就将其传给异常去处理;如果 args 是一个单独的对象,就生成只有一个元素的元组(就是单元素元组).
最后一项参数,traceback,同样是可选的(实际上很少用它),如果有的话,则是当异常触发时新生成的一个用于异常-正常化(exception—normally)的追踪(traceback)对象.
断言抛出异常:
断言对一个条件表达式进行判断。正常应返回真,如果运行时该条件表达式为假则抛出断言异常AssertionError. 语法如下:
assert expression[,arguments]
AssertionError 异常和其他的异常一样可以用 try-except语句块捕捉,但是如果没有捕捉,它将终止程序运行而且提供一个traceback:
Traceback(innermost last): File "<stdin>", line 1, in ?
AssertionError
对于断言触发的异常AssertError,可以提供一个参数,捕获这个断言异常的exception子句中的args可以获取这个参数。
try:
assert 1 == 0, 'One does not equal zerosilly!'
except AssertionError,args:
print '%s: %s' % (args.__class__.__name__,args)
从命令行执行上面的代码会导致如下的输出:
AssertionError: Onedoes not equal zero silly!
常见内建异常:
异常名称 描述
BaseException 所有异常的基类
SystemExit python 解释器请求退出
KeyboardInterrupt 用户中断执行(通常是输入^C)
Exception 常规错误的基类
StopIteration 迭代器没有更多的值
GeneratorExit 生成器(generator)发生异常来通知退出
SystemExit Python 解释器请求退出
StandardError 所有的内建标准异常的基类
ArithmeticError 所有数值计算错误的基类
FloatingPointError 浮点计算错误
OverflowError 数值运算超出最大限制
ZeroDivisionError 除(或取模)零 (所有数据类型)
AssertionError 断言语句失败
AttributeError 对象没有这个属性
EOFError 没有内建输入,到达 EOF 标记
EnvironmentError 操作系统错误的基类
IOError 输入/输出操作失败
OSError 操作系统错误
WindowsError Windows 系统调用失败
ImportError 导入模块/对象失败
KeyboardInterrupt 用户中断执行(通常是输入^C)
LookupError 无效数据查询的基类
IndexError 序列中没有没有此索引(index)
KeyError 映射中没有这个键
MemoryError 内存溢出错误(对于 Python 解释器不是致命的)
NameError 未声明/初始化对象 (没有属性)
UnboundLocalErrorh 访问未初始化的本地变量
ReferenceErrore 弱引用(Weak reference)试图访问已经垃圾回收了的对象
RuntimeError 一般的运行时错误
NotImplementedError 尚未实现的方法
SyntaxError Python 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode 相关的错误
UnicodeDecodeError Unicode 解码时的错误
UnicodeEncodeError Unicode 编码时错误
UnicodeTranslateError Unicode 转换时错误
Warning j 警告的基类
DeprecationWarning 关于被弃用的特征的警告
FutureWarning 关于构造将来语义会有改变的警告
OverflowWarning 旧的关于自动提升为长整型(long)的警告
PendingDeprecationWarning 关于特性将会被废弃的警告
RuntimeWarning 可疑的运行时行为(runtimebehavior)的警告
SyntaxWarning 可疑的语法的警告
UserWarning 用户代码生成的警告
自定义异常:
def class <SelfExceptionName>(<BaseExceptionName>):
pass
自定义一个继承了BaseExcetpton的异常类,什么也不做。对与自定义异常,只能通过raise语句抛出。
异常发生时,sys.exc_info() 函数可以获取当前的异常信息。返回一个三元组(exc_type,exc_value,exc_traceback)