python 异常处理

捕捉异常可以使用 try/except...else...finally 语句。

1、try原理及示例说明

try的工作原理是,当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

  • 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
  • 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
  • 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。

下面来看几个例子:

示例1:
# -*- coding: utf-8 -*-

if __name__ == '__main__':

    for error_key in (0, 1):
        print '======= {} ======='.format(error_key)
        try:
            print 'start'
            if error_key:
                raise ValueError('key error')       # 抛出 ValueError 异常
        except Exception, e:
            print 'catch: ', e      # e 存储异常信息
        else:
            print 'succ'          # try中代码无异常时执行
        finally:
            print 'end\n'        # 无论如何都执行

输出结果:


image.png

注意:else 必须放在 finally 前面。但是这两个可以都没有。

示例2:
# -*- coding: utf-8 -*-

if __name__ == '__main__':
    try:
        print 'start'
    except (ImportError, AttributeError, ImportError), e:
        print u'多个异常做同样处理时'
    except:
        raise IOError       # 其他所有异常都在此捕获,继续向上层级抛出

自定义异常

# -*- coding: utf-8 -*-

class MyException(BaseException):
    def __init__(self, *args, **kwargs):
        print 'welcome my Exception'

if __name__ == '__main__':
    try:
        raise MyException
    except:
        print 'catch'

输出:


image.png

通过创建一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的继承自Exception类(或者BaseException类)通过直接或间接的方式。当然你不继承也不会报错,但是会缺失一些方法。具体可查看源码。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Python异常处理 异常概念: 异常:就是不正常的情况,程序开发过程中错误和BUG都是补充正常的情况 异常发生的...
    youngkun阅读 943评论 0 4
  • 异常处理在程序的健壮性上表现的尤为重要, 例1:#!/usr/bin/pythonimport traceback...
    古佛青灯度流年阅读 948评论 0 1
  • 一、简介 Python最强大的结构之一就是它的异常处理能力,所有的标准异常都使用类来实现,都是基类Exceptio...
    随风化作雨阅读 3,090评论 0 1
  • 生活的目的是什么? 金钱 快乐 还是什么? 一千个人有一千个答案 一千个人有一千个困惑 许多人都羡慕有梦想有最求的...
    超级懒羊羊阅读 153评论 0 0
  • 留学、工作、定居, 在德国生活的我, 如今已经阔别故乡20年了,今天我终于可以回到日思夜想的故乡——威海。 ...
    写作天使阅读 421评论 0 3