• Python 错误与异常详解


    1.错误和异常概念

    错误

    语法错误:代码不符合解释器或者编译器语法

    逻辑错误:不完整或者不合法输入或者计算出现问题

    异常

    程序遇到逻辑或者算法问题

    运行过程中计算机错误(内存不够或IO错误)

    区别

    错误是非正常的,是根本不应该出现的,比如缩进字符

    异常是一种程序运行条件,而非严重错误,比如用户输入过大

    注意

    如果没有手动对异常进行处理,那么该异常就会被解释器捕获并处理,处理的方法为忽略或终止程序

    2.常见错误

    NameError--使用未定义的变量

    SyntaxError--语法错误,常见程序格式不对。如if a后没有:

    IOError--打开一个不存在的文件或文件

    ZeroDivisionError--除零错误,即分母为零

    ValueError--传入值无效,强制类型转换时产生。如a=int('dd')

    KeyboardInterrupt--键盘中断错误,强制终止程序时产生。

    3.异常处理

    3.1运行前异常与运行时异常

    运行前错误(在Python解释器将代码转换为字节码的过程中发现的错误,不可被try-except捕获到

        SyntaxError

    运行时错误(程序运行起来才可以发现的错误,可被try-except捕获到)

        NameError、IOError、ValueError

    3.2try-except-else-finally语句

    3.2.1注意点

             如果except后不跟异常类,则表示捕获所有异常

             如果try捕获到try_suite中的异常属于某一个except后跟的异常类,那么就会执行该except的exception_block,如果都不属于,就会交给解释器。

             finally块的作用:无论是否有异常,都会执行finally块,所以finally块是为异常处理事件提供清理机制,常用来关闭文件或释放系统资源

    3.2.2执行顺序

             如果try_suite中没有异常,那么先执行else块,然后执行finally块

             如果try_suite中有异常,那么先执行except块,然后执行finally块,且如果该异常不属于任何一个except所定义的异常,也会先执行finally块,再交给解释器处理

    3.2.3语句格式

    try:

        try_suite

    except [Exception1 [,e]]:

        exception_block1

    except [Exception2 [,e]]:

        exception_block2

    ...

    except [ExceptionN [,e]]:

        exception_blockN

    else:

        none_execption

    finally:

        do_finally

    4.with...as语句与上下文管理

    格式

    with context [as var]:

        with_suite

    作用

    只是用来代替try-finally语句,不常用

    context表达式返回的是一个对象

    var用来保存context表达式返回的对象

    with_suite使用var变量来对context返回的对象进行操作

    原理

    with语句是指上下文管理

    上下文管理协议:包含__enter(self)和__exit__( self,exc_type,exc_value,traceback)两个方法,支持该协议的对象要实现这两个方法

    上下文管理器:定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入和退出操作

    进入上下文管理器:调用管理器__enter__()方法,如果设置as var语句,则var变量接收__enter__()方法返回值

    退出上下文管理器:调用管理器__exit__()方法。注意,如果with_suite中有异常,则先回调用__exit__()方法,然后才会交给解释器处理

    自定义上下文管理器

     1 class Mycontext(object):
     2 
     3          def __init__(self,name):
     4 
     5                    self.name=name
     6 
     7         
     8 
     9          def __enter__(self):
    10 
    11                    print "__enter__"
    12 
    13                    return self
    14 
    15         
    16 
    17          def __exit__(self,exc_type,exc_value,traceback):
    18 
    19                    print "__exit__"
    20 
    21                    print "***********************"
    22 
    23                    print "Error:",exc_type
    24 
    25                    print "info:",exc_value
    26 
    27                    print "traceback:",dir(traceback)
    28 
    29                    print "***********************"
    30 
    31  
    32 
    33 if __name__ == '__main__':
    34 
    35          with Mycontext('test context') as f:
    36 
    37                    print f.name
    38 
    39                    a
    自定义上下文管理器举例

    5. raise和assert语句

    5.1raise语句

    5.1.1作用

    用于主动抛出异常

    5.1.2格式

    raise exception[, args]

    5.1.3参数

    exception--异常类

    args--附带信息

    5.1.4举例

    raise NameError,11

    raise NameError,"tttt"

    raise NameError,('11','22')

    raise NameError,['11','22']

    raise NameError,{'11','22'}

    5.2assert语句

    5.2.1作用

    用于检测一个表达式是否为真,如果为假,引发AssertionError错误

    5.2.2格式

    assert expression[, args]

    5.2.3参数

    expression--表达式

    args--附带信息

    5.2.4举例

    assert 0,'ttt'

    assert 1,'ttt'

    assert 1==2 , 11

    assert 1==2,"tttt"

    assert 1==2,('11','22')

    assert 1==2,['11','22']

    assert 1==2,{'11','22'}

    6. 标准异常和自定义异常

    6.1标准异常

    6.1.1定义

    Python内建异常,程序执行前就已经存在

     

    6.1.2官网

    https://docs.python.org/2/library/exceptions.html

    6.2自定义异常

    6.2.1前提

    自定义异常必须继承于Exception类或其子类

    自定义异常只能主动触发

    6.2.2格式

    # -*- coding:utf8 -*-
    exception_dict={
             'FileNotExistException':u'文件不存在异常'
    }
    class YcException(Exception):
             def __init__(self, exception_type):
                       super(YcException,self).__init__()
                       self.exception_type=exception_type
    try:
             raise YcException(exception_dict['FileNotExistException'])
    except YcException as e:
             print e.exception_type
    自定义异常格式举例

    6.2.3触发

    raise 自定义异常名,附加信息

  • 相关阅读:
    2020春,不一样的学期不一样的软工实践
    尘埃落下,我抓住透明的阳光,温暖留在掌心
    敏捷软工
    《构建之法》& CI/CD调研
    2021年-软件工程-热身阅读作业
    从学生到科技工作者
    希望我能帮到你:给同学们软件开发的建议
    CC2020 分享信息
    【计算机教育】看《计算机科学导论》,发展计算思维能力
    【计算机教育】创新工程实践课程的反馈
  • 原文地址:https://www.cnblogs.com/yc913344706/p/7812787.html
Copyright © 2020-2023  润新知