程序员人生 网站导航

Python之异常处理

栏目:php教程时间:2015-05-22 08:40:40

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

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐