Python 中的异常处理与种类

异常处理是Python工程中补课避免的,进行异常处理,可以帮我们调试代码,使代码找起问题更加简单,更加容易哦。

一般都是利用Try,比较简单,代码也不复杂。

try:
    print 'try...'
    r = 10 / 0
    print 'result:', r
except ZeroDivisionError, e:
    print 'except:', e
finally:
    print 'finally...'
print 'END'

使用try...except捕获错误有一个巨大的好处,就是可以跨越多层调用,比如函数main()调用foo()foo()调用bar(),结果bar()出错了,这时,只要main()捕获到了,就可以处理:

def foo(s):
    return 10 / int(s)

def bar(s):
    return foo(s) * 2

def main():
    try:
        bar('0')
    except StandardError, e:
        print 'Error!'
    finally:
        print 'finally...'

 也就是说,不需要在每个可能出错的地方去捕获错误,只要在合适的层次去捕获错误就可以了。这样一来,就大大减少了写try...except...finally的麻烦。

 

异常应该是类对象。模块中定义了例外 <span class="pre">exceptions</span>。此模块不需要显式导入:异常在内置命名空间以及 <span class="pre">exceptions</span>模块中提供。

对于类异常,在<span class="pre">try</span>同一个声明中<span class="pre">except</span> 说提到的一类特殊条款,该条款还处理来自类(从中但也不例外类派生的任何异常类它派生)。通过子类化不相关的两个异常类永远不是等效的,即使它们具有相同的名称。

下面列出的内置异常可以由解释器或内置函数生成。除了提及的地方,他们有一个“关联值”,指示错误的详细原因。这可能是包含几个信息项的字符串或元组(例如,错误代码和解释代码的字符串)。关联值是语句的第二个参数 <span class="pre">raise</span>。如果异常类是从标准根类派生的<span class="pre">BaseException</span>,则相关联的值将作为异常实例的<span class="pre">args</span>属性存在。

用户代码可以引发内置异常。这可以用于测试异常处理程序或报告错误条件“​​就像”解释器引发相同异常的情况; 但请注意,没有任何可以防止用户代码提出不正确的错误。

内置的异常类可以被子类化以定义新的异常; 鼓励程序员从<span class="pre">Exception</span> 类或其子类之一导出新的异常,而不是从<span class="pre">BaseException</span>。有关定义异常的更多信息,请参见Python教程中 用户定义的异常

以下异常仅用作其他异常的基类。

异常BaseException

所有内置异常的基类。它不是直接由用户定义的类继承(为此使用<span class="pre">Exception</span>)。如果 <span class="pre">str()</span>或者<span class="pre">unicode()</span>是在这个类的一个实例上被调用,返回实例的参数表示,或者当没有参数时,返回空字符串。

args

给异常构造函数的元组元组。一些内置异常(如<span class="pre">IOError</span>)期望一定数量的参数,并为此元组的元素分配特殊含义,而其他异常通常仅使用单个字符串给出错误消息。

异常Exception

所有内置的,非系统退出的异常都是从这个类派生出来的。所有用户定义的异常也应该从此类派生。

更改版本2.5:更改为继承<span class="pre">BaseException</span>

异常StandardError

该基类除了所有内置例外<span class="pre">StopIteration</span>, <span class="pre">GeneratorExit</span><span class="pre">KeyboardInterrupt</span><span class="pre">SystemExit</span>。 <span class="pre">StandardError</span>本身源于<span class="pre">Exception</span>

异常ArithmeticError

对于那些内置异常的基类时引发的各种算术错误:<span class="pre">OverflowError</span><span class="pre">ZeroDivisionError</span>, <span class="pre">FloatingPointError</span>

异常BufferError

当无法执行缓冲区相关操作时引发。

异常LookupError

当映射或序列上使用的键或索引无效时引发异常的基类:<span class="pre">IndexError</span><span class="pre">KeyError</span>。这可以直接提出来<span class="pre">codecs.lookup()</span>

异常EnvironmentError

对于可以在Python的系统外发生异常的基类: <span class="pre">IOError</span><span class="pre">OSError</span>。当使用2元组创建此类型的异常时,第一个项目在实例的<span class="pre">errno</span>属性上可用(假设为错误号),第二个项目在属性上 <span class="pre">strerror</span>可用(通常是关联的错误消息)。元组本身也可以在属性上使用<span class="pre">args</span>

新版本1.5.2。

当使用<span class="pre">EnvironmentError</span>3元组实例化异常时,前两个项目如上所述,而第三个项目在该<span class="pre">filename</span>属性上 可用。但是,为了向后兼容,该 <span class="pre">args</span>属性仅包含前两个构造函数参数的2元组。

<span class="pre">filename</span>属性是<span class="pre">None</span>使用3个参数以外的其他异常创建的。的<span class="pre">errno</span><span class="pre">strerror</span>属性也<span class="pre">None</span>当实例与其他大于2个或3个参数创建。在最后一种情况下,<span class="pre">args</span>将逐个构造函数的参数包含为元组。

以下异常是实际引发的异常。

异常AssertionError

<span class="pre">assert</span>声明失败时提起。

异常AttributeError

属性引用(请参阅属性引用)或赋值失败时引发。(当一个对象根本不支持属性引用或属性赋值时,<span class="pre">TypeError</span>会被提出。)

异常EOFError

当其中一个内置函数(<span class="pre">input()</span><span class="pre">raw_input()</span>)在没有读取任何数据的情况下触发文件结束条件(EOF)时引发。(注:在 <span class="pre">file.read()</span><span class="pre">file.readline()</span>方法时,他们打EOF返回一个空字符串。)

异常FloatingPointError

当浮点操作失败时触发。这个异常总是定义的,但是只有当Python配置了该<span class="pre">--with-fpectl</span>选项,或者<span class="pre">WANT_SIGFPE_HANDLER</span><span class="pre">pyconfig.h</span>文件中定义了符号时,才能引发此异常 。

异常GeneratorExit

发电机<span class="pre">close()</span>方法被调用时提起。它直接继承<span class="pre">BaseException</span>而不是,<span class="pre">StandardError</span> 因为它在技术上不是错误。

在版本2.6中更改:更改为继承<span class="pre">BaseException</span>

异常IOError

当I / O操作(如<span class="pre">print</span>语句,内置 <span class="pre">open()</span>函数或文件对象的方法)因I / O相关原因(例如“未找到文件”或“磁盘已满”)而失败时引发。

此类衍生<span class="pre">EnvironmentError</span>。有关异常实例属性的更多信息,请参阅上面的讨论。

在版本2.6中更改:更改<span class="pre">socket.error</span>为使用此作为基类。

异常ImportError

<span class="pre">import</span>语句找不到模块定义或找不到要导入的名称时引发。<span class="pre">from <span class="pre">... <span class="pre">import</span></span></span>

异常IndexError

当序列下标超出范围时提起。(Slice索引被静默地截断以落在允许的范围内;如果索引不是一个纯整数, <span class="pre">TypeError</span>则会被提升。)

异常KeyError

当在现有密钥集中找不到映射(字典)键时引发。

异常KeyboardInterrupt

当用户点击中断键(正常<span class="pre">Control-C</span>或 <span class="pre">Delete</span>)时触发。在执行期间,定期检查中断。当内置函数<span class="pre">input()</span><span class="pre">raw_input()</span>正在等待输入时,键入的中断也会引发此异常。异常继承 <span class="pre">BaseException</span>而不被意外地捕获 <span class="pre">Exception</span>并因此阻止解释器退出的代码。

更改版本2.5:更改为继承<span class="pre">BaseException</span>

异常MemoryError

当操作内存不足时提起,但情况可能仍然会被抢救(通过删除某些对象)。相关联的值是一个字符串,指示什么样的(内部)操作用完了内存。请注意,由于底层内存管理架构(C的<span class="pre">malloc()</span>功能),解释器可能并不总是能够从这种情况中完全恢复; 但是它引发了一个异常,以便可以打印堆栈跟踪,以防万一出现程序的原因。

异常NameError

当找不到本地或全球名称时提起。这仅适用于不合格的名称。相关联的值是一个错误消息,其中包含无法找到的名称。

异常NotImplementedError

这个异常来源于<span class="pre">RuntimeError</span>。在用户定义的基类中,当需要派生类来覆盖该方法时,抽象方法应引发此异常。

异常OSError

这个异常来源于<span class="pre">EnvironmentError</span>。当函数返回与系统相关的错误(不是非法参数类型或其他偶然错误)时引发。的<span class="pre">errno</span>属性是从一个数字错误代码<span class="pre">errno</span>,并且<span class="pre">strerror</span>属性是相应的字符串,如将被C函数被打印<span class="pre">perror()</span>。请参阅模块<span class="pre">errno</span>,其中包含由底层操作系统定义的错误代码的名称。

对于涉及文件系统路径(例如<span class="pre">chdir()</span>或 <span class="pre">unlink()</span>)的异常,异常实例将包含第三个属性 <span class="pre">filename</span>,即传递给该函数的文件名。

新版本1.5.2。

异常OverflowError

当算术运算的结果太大而不能被表示时提升。对于长整型(这不会 <span class="pre">MemoryError</span>放弃)而且对于大多数具有纯整数的操作,这不会返回长整数。由于在C中缺少浮点异常处理的标准化,大多数浮点运算也没有被检查。

异常ReferenceError

当由<span class="pre">weakref.proxy()</span>函数创建的弱引用代理 在垃圾回收之后用于访问指称对象的属性时,会引发此异常。有关弱引用的更多信息,请参阅该<span class="pre">weakref</span>模块。

2.2版中的新功能:以前被称为<span class="pre">weakref.ReferenceError</span>异常。

异常RuntimeError

当检测到不属于任何其他类别的错误时引发。相关联的值是一个字符串,表示正确的错误。

异常StopIteration

迭代器<span class="pre">next()</span>方法引发,表明没有其他值。这是从而<span class="pre">Exception</span>不是<span class="pre">StandardError</span>,因为这不被认为是其正常应用程序中的错误。

版本2.2中新增。

异常SyntaxError

解析器遇到语法错误时引发。这可能发生在 <span class="pre">import</span>语句,<span class="pre">exec</span>语句,调用内置函数<span class="pre">eval()</span><span class="pre">input()</span>读取初始脚本或标准输入(也可交互式)时。

这个类的实例有属性<span class="pre">filename</span><span class="pre">lineno</span>, <span class="pre">offset</span>并且<span class="pre">text</span>为的细节更容易获得。 <span class="pre">str()</span> 的异常实例仅返回消息。

异常IndentationError

与错误缩进相关的语法错误的基类。这是一个子类<span class="pre">SyntaxError</span>

异常TabError

缩进时引发的标签和空格不一致。这是一个子类<span class="pre">IndentationError</span>

异常SystemError

当翻译发现内部错误时,提出了这种情况,但情况并不那么严重,导致它放弃了所有的希望。相关联的值是一个字符串,表示出现错误(低级别)。

您应该向Python解释器的作者或维护者报告。确保报告Python解释器的版本(<span class="pre">sys.version</span>它也是在交互式Python会话开始时打印的),确切的错误消息(异常关联值)以及触发错误的程序源可能的可能。

异常SystemExit

该异常由<span class="pre">sys.exit()</span>函数引发。当它不被处理时,Python解释器退出; 不打印堆栈追溯。如果关联值为纯整数,则指定系统退出状态(传递给C的<span class="pre">exit()</span>函数); 如果是<span class="pre">None</span>,退出状态为零; 如果有其他类型(如字符串),则打印对象的值,退出状态为一。

实例具有<span class="pre">code</span>设置为建议的退出状态或错误消息(默认为<span class="pre">None</span>)的属性。此外,这种异常直接来自于<span class="pre">BaseException</span>而不是<span class="pre">StandardError</span>,因为它在技术上不是错误。

调用<span class="pre">sys.exit()</span>被转换为异常,以便清理处理程序(<span class="pre">finally</span>语句的<span class="pre">try</span>子句)可以被执行,并且调试器可以执行脚本而不会失去控制的风险。<span class="pre">os._exit()</span>如果绝对有必要立即退出(例如,在调用后的子进程<span class="pre">os.fork()</span>)中,则可以使用该函数。

唯一的例外来自继承<span class="pre">BaseException</span>,而不是<span class="pre">StandardError</span> 或<span class="pre">Exception</span>使得它不会意外地被映入代码捕获 <span class="pre">Exception</span>。这允许异常正常传播并导致解释器退出。

更改版本2.5:更改为继承<span class="pre">BaseException</span>

异常TypeError

当操作或功能应用于不适当类型的对象时提起。关联值是一个字符串,提供有关类型不匹配的详细信息。

异常UnboundLocalError

当引用函数或方法中的局部变量时引用,但没有值绑定到该变量。这是一个子类 <span class="pre">NameError</span>

异常UnicodeError

当与Unicode相关的编码或解码错误发生时引发。它是一个子类<span class="pre">ValueError</span>

<span class="pre">UnicodeError</span>具有描述编码或解码错误的属性。例如,<span class="pre">err.object[err.start:err.end]</span>给出编解码器失败的特定无效输入。

encoding

引起错误的编码的名称。

reason

描述特定编解码器错误的字符串。

object

编解码器正在尝试编码或解码的对象。

start

第一个无效数据索引<span class="pre">object</span>

end

上次无效数据后的索引<span class="pre">object</span>

 

异常UnicodeEncodeError

在编码期间发生Unicode相关错误时引发。它是一个子类 <span class="pre">UnicodeError</span>

异常UnicodeDecodeError

在解码过程中发生Unicode相关错误时引发。它是一个子类 <span class="pre">UnicodeError</span>

异常UnicodeTranslateError

在翻译期间发生Unicode相关错误时引发。它是一个子类<span class="pre">UnicodeError</span>

异常ValueError

当内置操作或函数接收到具有正确类型但不正确值的参数时引发,并且情况未被更精确的异常描述,例如<span class="pre">IndexError</span>

异常VMSError

仅适用于VMS。发生VMS特定错误时引发。

异常WindowsError

当出现特定于Windows的错误或错误号不对应于某个<span class="pre">errno</span>值时引发。该<span class="pre">winerror</span>和 <span class="pre">strerror</span>值是从的返回值创建 <span class="pre">GetLastError()</span><span class="pre">FormatMessage()</span>从Windows平台的API函数。该<span class="pre">errno</span>值将值映射<span class="pre">winerror</span>到相应的<span class="pre">errno.h</span>值。这是一个子类<span class="pre">OSError</span>

版本2.5更改:以前的版本将<span class="pre">GetLastError()</span>代码放入<span class="pre">errno</span>

异常ZeroDivisionError

当分割或模运算的第二个参数为零时提升。关联值是指示操作数的类型和操作的字符串。

以下例外被用作警告类别; <span class="pre">warnings</span> 有关详细信息,请参阅该模块。

异常Warning

警告类别的基类。

异常UserWarning

由用户代码生成的警告的基类。

异常DeprecationWarning

关于已弃用功能的警告的基类。

异常PendingDeprecationWarning

关于将来不推荐使用的功能的警告的基类。

异常SyntaxWarning

关于可疑语法的警告的基类。

异常RuntimeWarning

关于可疑运行时行为的警告的基类。

异常FutureWarning

关于将来会在语义上改变的结构的警告的基类。

异常ImportWarning

关于模块进口中可能出现的错误的警告的基础类。

异常UnicodeWarning

与Unicode有关的警告的基类。

异常层次

内置异常的类层次结构为:

相关推荐