#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 异常                      描述
# Exception               所有内建异常
# SystemExit              由sys.exit()产生
# StandardError           除SystemExit外所有内建异常
# ArithmeticError         所有运算异常
# FloatingPointError      浮点数运算异常
# OverflowError           数值溢出
# ZeroDivisionError       被零除
# AssertionError          assert语句引起的异常
# AttributeError          属性名称不可用时引起
# EnvironmentError        Python外部错误
# IOError                 I/O 或与文件有关的错误(输入/输出错误)
# OSError                 操作系统错误
# WindowsError            Windows错误
# EOFError                当到达一个文件的末尾时引起
# ImportError             import语句失败
# KeyboardInterrupt       键盘中断(通常是 Ctrl+C)
# LookupError             索引或关键字错误
# IndexError              超出序列的范围
# KeyError                不存在的字典关键字
# MemoryError             内存不足
# NameError               寻找局部或全局变量时失败
# UnboundLocalError       未绑定变量
# RuntimeError            一般运行时错误
# NotImplementedError     不可实现的特征
# SyntaxError             语法错误
# TabError                不一致的制表符使用 (由 -tt 选项产生)
# IndentationError        缩进错误
# SystemError             解释器致命错误
# TypeError               给一个操作传递了一个不适当的类型
# ValueError              值错误(不合适或丢失)
# UnicodeError            Unicode编码错误

#抛出异常 raise exception [, value ]
#excepetion 异常类型 ,value 是对异常的描述

# raise   WindowsError,"系统错误"
# raise 如果没有参数,则抛出最近一次发生的异常

# try:
#     f=open('foo')
# except IOError,a:#
#     print 'Unable to open "foo":',a

# try:
#     f=open('foo')
# except: #省略参数表示:捕获一切异常
#     print 'an error occurred'
#
# try语句也支持else从句. else从句必须放在最后一个except从句后. 这块代码只在try块中的语句没有引发异常的时候运行.例如:
# try:
#     f = open('foo', 'r')
# except IOError:
#     print 'Unable to open foo'
# else:
#     data = f.read()
#     f.close()
# 复制代码
# finally语句定义了在try块中代码的结束操作,例如:
# f = open('foo','r')
# try:
#     # Do some stuff
#     ...
#     finally:
#     f.close()
#     print "File closed regardless of what happened."
# 复制代码
# finally 语句并不用于捕获异常.它用来指示无论是否发生异常都要执行的语句块。如果没有引起异常,finally块中的语句将在try块中语句执行完毕后执行;如果有异常发生,控制将先传递到finally块中的第一条语句.在这块语句执行完后,异常被自动再次引发,然后交由异常处理语句处理. finally和except语句不能在同一个try语句中出现. Table 5.1列出了Python中定义的全部内建异常类型.(关于异常的更多细节,参见附录A)
#
# 可以通过异常名称来访问一个异常。例如:
# try:
#     statements
# except LookupError:     # 捕获 IndexError 或 KeyError
#     statements
# 或
# try:
#     statements
# except StandardError:   # 捕获任何内建的异常类型
#     statements
# 复制代码
# 1.4. 定义新的异常
#
# 所有的内建异常类型都是使用类来定义的.要定义一个新的异常,就创建一个父类为exceptions.Exception的新类:
# import exceptions
# # Exception class
# class NetworkError(exceptions.Exception):
#     def __init__(self,args=None):
#         self.args = args
# 复制代码
# args应该像上面那样使用.这样就可以使用raise语句来引发这个异常,并显示出错误返回信息以及诊断,如:
#
# raise NetworkError, "Cannot find host."
#
#
# 通过调用NetworkError("Cannot find host.")可以创建一个NetworkError异常的实例. 如:
# a=NetworkError("Cannot find host.")
# print a                 #得到 Cannot find host.
# 复制代码
# 如果你使用一个不是 self.args 的属性名或你根本没有这个属性, 异常实例就没有这种行为.
#
# 当使用 raise 语句有意引发一个异常时, raise语句的可选参数将做为该异常的构造函数(__init__()方法)参数.如果异常的构造函数需要一个以上参数,有两种方法可以用来引发这种异常:
# import exceptions
# # Exception class
# class NetworkError(exceptions.Exception):
#     def _ _init_ _(self,errno,msg):
#     self.args = (errno, msg)
#     self.errno = errno
#     self.errmsg = msg
#
# # 方法一
# raise NetworkError(1, 'Host not found')
#
# # 方法二
# raise NetworkError, (1, 'Host not found')
# 复制代码
# 基于类的这种异常体制让你能够轻易创建多级异常.例如,前边定义的 NetworkError异常可以用做以下异常的基类:
# class HostnameError(NetworkError):
#     pass
#
# class TimeoutError(NetworkError):
#     pass
#
# def error3():
#     raise HostnameError
#
# def error4():
#     raise TimeoutError
#
# try:
#     error3()
# except NetworkError:
#     import sys
#     print sys.exc_type    # 打印出异常类型
# 复制代码
# 在这个例子中except NetworkError 语句能捕获任何从NetworkError中继承而来的异常. 通过变量 sys.exc_type可以得到这个特殊异常的名称. sys.exc_info()函数用于返回最近一个异常的信息(不依靠全局变量,属于安全线程).
#
# 1.5. 断言和__debug__
#
# assert语句用来断言某个条件是真的,常用于程序调试. assert语句的一般格式为:
#
# assert test [, data]
#
# test是一个表达式,它返回True或False. 如果test的值为假, assert语句就引发AssertionError异常, 可选的data字符串将被传递给这个异常.例如:
# def write_data(file,data):
#     assert file, "write_data: file is None!"
#     ...
#     复制代码
#     实际上assert语句在执行时会被实时翻译为下面的代码:
#     if __debug__:
#         if not (test):
#             raise AssertionError, data
#     复制代码
#     __debug__是一个内建的只读值,除非解释器运行在最佳化模式(使用 -O 或 -OO 选项),否则它的值总是 True. 虽然__debug__被设计为供 assert 语句使用,你仍然可以在任何自定义调试代码中使用它.
#
#     assert 语句不能用于用来确保程序执行正确的场合,因为该语句在最佳化模式下会被忽略掉.尤其不要用assert来检查用户输入. assert语句用于正常情况下应该总是为真的场合;若assert语句引发了异常,那就代表程序中存在bug,是程序员出了问题而不是用户出现了问题.
#
#     如果打算将上边的 write_data() 函数交付给最终用户使用, assert语句就应该使用if语句和错误处理语句来重写.

  

posted on 2013-08-31 00:01  神·鲸落  阅读(452)  评论(0编辑  收藏  举报