20130714-Python异常处理机制

来源:互联网 发布:网络主播菲儿个人资料 编辑:程序博客网 时间:2024/05/11 17:05

1、目标

         使用异常处理机制

         常用异常类

 

2、Python异常处理机制

2.1、异常处理关键字

关键字

说明

形式

try

检查代码块

 

except

捕捉处理异常

一个try可连续使用多个except

一个except可捕捉多种异常

except Exception, e:

  #处理异常

except (ValueError, TypeErroe), e:

  #一个except处理多个异常

else

try无异常时执行

 

finally

无论异常与否,必执行

 

raise

触发抛出异常

raise [SomeException [,args[,traceback]]]

#traceback:异常触发时的跟踪记录对象

2.2、异常处理流程示例

try:

  #检查代码块

except ValueError, e:

  #处理ValueError

except TypeError, e

  #处理TypeError

except Exception, e

  raise  string, “new exception”  #抛出异常

else:

  #无异常时,执行

finally:

  #清理垃圾

 

3、常用异常类

3.1、异常类继承树

3.2 异常类Exception属性

3.2.1继承自BaseException的

 

属性

说明

args

raise Exception [,args [, traceback]] 中的args,元组类型

raise Exception, (“error message”, errorno)

message

Exception(“my message”), “my message” 为message属性值

注(’my message’,)为args元组

 

 

方法

说明

__reduce__

__reduce__(self):序列化自身

__setstate__

当处理unpickling(不可序列化) 的对象的实例属性时,可以使用特殊的方法_getstate_() 和 _setstate_()来修改类实例的状态。

示例说明见附录1

__unicode__

解码为unicode对象

 

 

装饰器(slot wrapper)

说明

__init__

 

__str__

返回可读字符串

__repr__

representation,返回可解析的字符串。它的返回值通常可以用来重新获得该对象,通常情况下 obj==eval(repr(obj))

__setattr__

添加(属性/值)对,__setattr__(self, key, value)    示例见附录2

__delattr__

删除(属性/值)对,__delattr__ (self, key)

__getattribute__

获取属性,__getattr__ (self, key)

__getitem__

迭代args元组

__getslice__

获取args元组片段,__getslice__(i,j) = __getitem__(slice(i,j)

 

3.2.2继承自Object

内建方法

说明

__new__

构造方法

__subclasshook__

__subclasshook__(subclass)

判断subclass是否为本类的子类

 

 

方法

说明

__format__

接受一个格式化指示符作为参数,来控制怎样格式化自己。

__format__(self, format_spec)      示例见附录3

__reduce_ex__

__reduce_ex__(self, protocol)

当pickling时被调用,如果没有,则调用__reduce__,若也没有,则此类可以正常pickling

__sizeof__

获取对象占用字节数

 

装饰器

说明

__hash__

计算对象的hash键值

 

 

 

3.3异常类列表

异常类

描述

BaseException

异常基类

SystemExit

python解释器请求退出

KeyboardInterrupt

用户中断执行(ctl+c)

Exception

常规错误的基类

StopIteration

迭代器没有更多值

GeneratorExit

生成器异常请求退出

 

 

ArithmeticError

所有数值计算错误基类

FloatingPointError

浮点计算错误

OverflowError

数值溢出异常

ZeroDivisionError

除以0异常

AssertionError

断言语句异常

AttributeError

对象没有这个属性

EOFError

到达EOF标记

 

 

EnvironmentError

操作系统错误基类

IOError

输入输出操作失败

OSError

操作系统错误

WindowsError

Windows系统调用失败

ImportError

导入模块/对象失败

KeyboardInterrupt

用户中断执行(ctrl+c)

 

 

LookupError

无效数据查询基类

IndexError

序列中没有此索引

KeyError

映射中没有此键

MemoryError

内存溢出

NameError

未声明/未初始化对象

UnboundLocalError

访问未初始化本地变量

ReferenceError

弱引用访问已回收对象错误

RuntimeError

一般运行时错误

NotImplementatedError

尚未实现的方法

 

 

SystemError

一般的解释器系统错误

IndentationError

缩进错误

TabError

Tab和空格混用

SyntaxError

python语法错误

TypeError

对类型无效的操作

ValueError

传入无效的参数

 

 

UnicodeError

Unicode相关错误

UnicodeDecodeError

Unicode解码错误

UnicodeEncodeError

Unicode编码错误

UnicodeTranslatError

Unicode转换错误

 

 

Warning

警告的基类

DeprecationWarning

关于被弃用特征的警告

FutureWarning

构造将来语义会有改变的警告

OverflowWarning

自动提升长整型警告   2.4弃用

PendingDeprecationWarning

特性将被弃用的警告

RuntimeWarning

可疑的运行时行为的警告

SyntaxWarning

可疑语法的警告

UserWarning

用户代码生成警告

 

 

附录:

1、__setstate__ : 修改Foo对象的状态(修改打开的文件,和写入位置)

class Foo(object):

    def __init__(self, value, filename):

        self.value = value

        self.logfile = file(filename, 'w')

    def __getstate__(self):

        """Return state values to be pickled."""

        f = self.logfile

        return (self.value, f.name, f.tell())

    def __setstate__(self, state):

        """Restore state from the unpickled state values."""

        self.value, name, position = state

        f = file(name, 'w')

        f.seek(position)

        self.logfile = f

 

 

2、__setattr__,__delattr__, __getattr__

class storage(dict):
   
 #通过使用__setattr__, __getattr__, __delattr__
   
 #可以重写dict,使之通过“.”调用
   
 def __setattr__(self, key, value):
       
 self[key] = value
   
 def __getattr__ (self, key):
       
 try:
           
 return self[key]
       
 except KeyError, k:
           
 return None
   
 def __delattr__ (self, key):
       
 try:
           
 del self[key]
       
 except KeyError, k:
           
 return None

 

3、__format__()

def __format__(self, format_spec):
 if isinstance(format_spec, unicode):
  return unicode(str(self))
 else:
  return str(self)