Python 异常处理

From: http://www.cainiao8.com/python/basic/python_16_exception.html

为什么使用异常

错误处理、事件通知、特殊情况处理、退出时的行为、不正常的程序流程。

简单的示例

在没有任何定义x变量的时候:

print x
print 1

将会抛出NameError异常:

NameError: name 'x' is not defined

而且1并不会被输出,也就是说程序将被中断。如果讲代码修改如下:

try:
    print x
except NameError:
    print "Something is wrong!"
print 1

  

得到的输出将是:

Something is wrong!
1

可见,我们定义的except会“抓住”NameError类型的语句,并且执行相应的处理代码,而且程序不会被中断。

使用raise

我们可以自己触发异常,例如:

raise IndexError

Python会返回:

Traceback (most recent call last):
  File "d:\我的文档\桌面\todo\exep.py", line 1, in <module>
    raise IndexError
IndexError

自定义的异常

下面定义了一个MyException类,它继承自Python内置的Exception类。

class MyException(Exception):pass
try:
    #some code here
    raise MyException
except MyException:
    print "MyException encoutered"

结果为:

MyException encoutered

可以在一个except内捕获多个异常:

except (AttributeError, TypeError, SyntaxError):
  

捕获所有异常

只要在except后面不加任何异常类型,这个except块就可以捕获所有的异常。

except:

捕获异常的继承关系

当我们except Super的时候,同样会捕获到raise Sub的异常。

finally

无论try块是否抛出异常,永远执行的代码。通常用来执行关闭文件,断开服务器连接的功能等等。

class MyException(Exception):pass
try:
    #some code here
    raise MyException
except MyException:
    print "MyException encoutered"
finally:
    print "Arrive finally"

结果:

MyException encoutered
Arrive finally

try、except、else

可以在try块里加入else块,代码块将在没有异常被抛出的时候执行:

try:
    print "normal code here"
except MyException:
    print "MyException encoutered"
else:
    print "No exception"
finally:
    print "Arrive finally"

结果为:

normal code here
No exception
Arrive finally

raise异常、同时添加数据

raise异常的同时,我们可以添加一些额外的数据,就像下面的例子一样:

class MyException(Exception):pass
try:
    raise MyException,", and some additional data"
except MyException,data:
    print "MyException encoutered"
    print data

断言assert

断言是指期望指定的条件满足,如果不满足则抛出AssertionError异常。例如:

def positive(x):
    assert x > 0
    print "x"
positive(1)
positive(0)

positive(0)一句将会抛出一个异常。

with/as

with/as语句主要是为了代替try/finally语句、通常用来做一些善后工作或者是清理现场的工作。

with open('test.txt') as myfile:
    for line in myfile:
        #code here
    #code here

当with代码块结束之后,文件将会自动关闭。这是因为返回的对象支持context management protocol。原书598页有关于该协议的讨论,例如如何自定义一个支持该协议、从而支持with语句的类。


From: http://www.cnblogs.com/vincent-lee/archive/2011/11/23/2259149.html

BaseException              所有异常基类
 +-- SystemExit                python解释器请求退出
 +-- KeyboardInterrupt            用户中断执行(通常是输入ctrl+C)
 +-- GeneratorExit              生成器(generator)发生异常来通知退出 
 +-- Exception                常规错误的基类
      +-- StopIteration           迭代器没有更多的值
      +-- StandardError           所有的内建标准异常的基类
      |    +-- BufferError         
      |    +-- ArithmeticError       所有数值计算错误的基类
      |    |    +-- FloatingPointError   浮点计算错误
      |    |    +-- OverflowError     数值运算超出最大限制
      |    |    +-- ZeroDivisionError   除(或取模)零(所有数据类型)
      |    +-- AssertionError       断言语句失败
      |    +-- AttributeError        对象没有这个属性
      |    +-- EnvironmentError       操作系统错误的基类
      |    |    +-- IOError          输入输出失败
      |    |    +-- OSError          操作系统错误 
      |    |         +-- WindowsError (Windows)    windows系统调用失败
      |    |         +-- VMSError (VMS)         
      |    +-- EOFError          没有内建输入,到达EOF标记          
      |    +-- ImportError        导入模块/对象 失败
      |    +-- LookupError        无效数据查询的基类
      |    |    +-- IndexError      序列中没有此索引(index)
      |    |    +-- KeyError       映射中没有这个键
      |    +-- MemoryError        内存溢出错误(对于Python解释器不是致命的)
      |    +-- NameError         未声明/初始化对象(没有属性)
      |    |    +-- UnboundLocalError  访问未初始化的本地变量
      |    +-- ReferenceError       弱引用(Weak reference)试图访问已经垃圾回收了的对象
      |    +-- RuntimeError        一般的运行时错误
      |    |    +-- NotImplementedError 尚未实现的方法
      |    +-- SyntaxError         Pythony语法错误
      |    |    +-- IndentationError   缩进错误

      |    |         +-- TabError     Tab和空格混用
      |    +-- SystemError         一般的解释器系统错误
      |    +-- TypeError          对类型无效的操作
      |    +-- ValueError         传入无效的参数
      |         +-- UnicodeError     Unicode相关错误
      |              +-- UnicodeDecodeError    Unicode解码时错误
      |              +-- UnicodeEncodeError    Unicode编码时错误
      |              +-- UnicodeTranslateError   Unicode转换时错误
      +-- Warning               警告的基类       
           +-- DeprecationWarning      关于被启用的特征的警告
           +-- PendingDeprecationWarning  关于构造将来语义会有改变的警告
           +-- RuntimeWarning         可疑的运行时行为的警告
         +-- SyntaxWarning       可疑的语言的警告  
           +-- UserWarning        用户代码生成警告
           +-- FutureWarning
	   +-- ImportWarning      导入模块/对象警告
	   +-- UnicodeWarning      Unicode警告
	   +-- BytesWarning       Bytes警告
       +-- Overflow Warning      旧的关于自动提升为长整型(long)的警告

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值