1、甚么是异常?
异常即是1个事件,该事件会在程序履行进程中产生,影响了程序的正常履行。
1般情况下,在Python没法正常处理程序时就会产生1个异常。
异常是Python对象,表示1个毛病。
当Python脚本产生异常时我们需要捕获处理它,否则程序会终止履行。
2、异常处理
捕捉异常可使用try/except语句。
try/except语句用来检测try语句块中的毛病,从而让except语句捕获异常信息并处理。
如果你不想在异常产生时结束你的程序,只需在try里捕获它。
异常语法:
以下为简单的try....except...else的语法:
try:
<语句> #运行别的代码
except <名字>:
<语句> #如果在try部分引发了'name'异常
except <名字>,<数据>:
<语句> #如果引发了'name'异常,取得附加的数据
else:
<语句> #如果没有异常产生
try的工作原理是,当开始1个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就能够回到这里,try子句先履行,接下来会产生甚么依赖于履行时是不是出现异常。
try...except的使用方法
try...except用于处理问题语句,捕获可能出现的异常。try子句中的代码块放置可能出现异常的语句,except子句中的代码块处理异常。
演示try...except语句捕获IOError异常
try:
file("hello.txt", "r") #如果文件不存在,引发异常
print "读文件"
except IOError: #捕获IO异常
print "文件不存在"
except: #其它异常
print "程序异常"
python与Java的异常处理模式相似,异常处理语句也能够嵌套,演示以下:
try:
s = "hello"
try:
print s[0] + s[1]
print s[0] - s[1]
except TypeError:
print "字符串不支持减法运算"
except:
print "异常"
如果外层try子句中的代码引发异常,程序将直接跳转到外层try对应的except子句,而内部的try子句将不会被履行。
try...finally的使用方法
try...except后还可以添加1个finally子句。不管异常是不是产生,finally子句都会被履行。所有的finally子句通经常使用于关闭因异常而不能释放的系统资源。
try:
f = open("hello.txt", "r")
try:
print f.read(5)
except:
print "读文件异常"
finally:
print "释放资源"
f.close()
except IOError:
print "文件不存在"
使用raise抛出异常
当程序出现毛病,python会自动引发异常,也能够通过raise显示地引发异常。1旦履行了raise语句,raise后面的语句将不能履行。
演示raise用法
try:
s = None
if s is None:
print "s 是空对象"
raise NameError #如果引发NameError异常,后面的代码将不能履行
print len(s)
except TypeError:
print "空对象没有长度"
自定义异常
python允许程序员自定义异常,用于描写python中没有触及的异常情况,自定义异常必须继承Exception类,自定义异常依照命名规范以"Error"结尾,显示地告知程序员这是异常。自定义异常使用raise语句引发,而且只能通过人工方式触发。
from __future__ import division
class DivisionException(Exception):
def __init__(self, x, y):
Exception.__init__ (self, x, y) #调用基类的__init__进行初始化
self.x = x
self.y = y
if __name__ == "__main__":
try:
x = 3
y = 2
if x % y > 0: #如果大于0, 则不能被初始化,抛出异常
print x/y
raise DivisionException(x, y)
except DivisionException,div: #div 表示DivisionException的实例对象
print "DivisionExcetion: x/y = %.2f" % (div.x/div.y)
assert语句的使用
assert语句用于检测某个条件表达式是不是为真。assert语句又称为断言语句,即assert认为检测的表达式永久为真,if语句中的条件判断都可使用assert语句检测。
附:python标准异常
BaseExceptiona:所有异常的基类
SystemExitb python:解释器要求退出
KeyboardInterruptc:用户中断履行(通常是输入^C)
Exceptiond:常规毛病的基类
StopIteratione:迭代器没有更多的值
GeneratorExita:生成器(generator)产生异常来通知退出
SystemExith:Python 解释器要求退出
StandardErrorg:所有的内建标准异常的基类
ArithmeticErrord:所有数值计算毛病的基类
FloatingPointErrord:浮点计算毛病
OverflowError:数值运算超越最大限制
ZeroDivisionError:除(或取模)零 (所有数据类型)
AssertionErrord:断言语句失败
AttributeError:对象没有这个属性
EOFError:没有内建输入,到达EOF 标记
EnvironmentErrord:操作系统毛病的基类
IOError:输入/输出操作失败
OSErrord:操作系统毛病
WindowsErrorh Windows:系统调用失败
ImportError:导入模块/对象失败
KeyboardInterruptf:用户中断履行(通常是输入^C)
LookupErrord:无效数据查询的基类
IndexError:序列中没有无此索引(index)
KeyError:映照中没有这个键
MemoryError:内存溢出毛病(对Python 解释器不是致命的)
NameError:未声明/初始化对象 (没有属性)
UnboundLocalErrorh:访问未初始化的本地变量
ReferenceErrore:弱援用(Weak reference)试图访问已垃圾回收了的对象
RuntimeError:1般的运行时毛病
NotImplementedErrord:还没有实现的方法
SyntaxError:Python 语法毛病
IndentationErrorg:缩进毛病
TabErrorg:Tab 和空格混用
SystemError 1般的解释器系统毛病
TypeError:对类型无效的操作
ValueError:传入无效的参数
UnicodeErrorh:Unicode 相干的毛病
UnicodeDecodeErrori:Unicode 解码时的毛病
UnicodeEncodeErrori:Unicode 编码时毛病
UnicodeTranslateErrorf:Unicode 转换时毛病
Warningj:正告的基类
DeprecationWarningj:关于被弃用的特点的正告
FutureWarningi:关于构造将来语义会有改变的正告
OverflowWarningk:旧的关于自动提升为长整型(long)的正告
PendingDeprecationWarningi:关于特性将会被废弃的正告
RuntimeWarningj:可疑的运行时行动(runtime behavior)的正告
SyntaxWarningj:可疑的语法的正告
UserWarningj:用户代码生成的正告
Python的Exception层次结构
Exception
|
+-- SystemExit
+-- StopIteration
+-- StandardError
| |
| +-- KeyboardInterrupt
| +-- ImportError
| +-- EnvironmentError
| | |
| | +-- IOError
| | +-- OSError
| | |
| | +-- WindowsError
| | +-- VMSError
| |
| +-- EOFError
| +-- RuntimeError
| | |
| | +-- NotImplementedError
| |
| +-- NameError
| | |
| | +-- UnboundLocalError
| |
| +-- AttributeError
| +-- SyntaxError
| | |
| | +-- IndentationError
| | |
| | +-- TabError
| |
| +-- TypeError
| +-- AssertionError
| +-- LookupError
| | |
| | +-- IndexError
| | +-- KeyError
| |
| +-- ArithmeticError
| | |
| | +-- OverflowError
| | +-- ZeroDivisionError
| | +-- FloatingPointError
| |
| +-- ValueError
| | |
| | +-- UnicodeError
| | |
| | +-- UnicodeEncodeError
| | +-- UnicodeDecodeError
| | +-- UnicodeTranslateError
| |
| +-- ReferenceError
| +-- SystemError
| +-- MemoryError
|
+---Warning
|
+-- UserWarning
+-- DeprecationWarning
+-- PendingDeprecationWarning
+-- SyntaxWarning
+-- OverflowWarning
+-- RuntimeWarning
+-- FutureWarning
参考文献:
http://blog.chinaunix.net/uid⑵1505614-id⑶618285.html
http://www.phperz.com/article/14/1009/14507.html
http://blog.chinaunix.net/uid⑵2920230-id⑶074716.html