Python运行环境与异常处理

发布时间:2019-09-17 07:45:25编辑:auto阅读(1509)

    1、Python的启动

    Python的命令格式:

    python [option] ... [-c cmd | -m mod | file | -] [arg] ...
    选项描述
    -J

    启动将从Python3中删除或更改某些功能的警告

    -B
    阻止在导入时创建.pyc或.pyo文件
    -E忽略环境变量
    -h
    打印所有可用命令行选项的列表
    -i
    在程序执行后进入交互模式
    -m module以脚本的形式运行库模块module
    -O
    优化模式
    -OO
    优化模式,在创建.pyo文件时删除文档字符串
    -Q arg

    指定Pyhthon2中除法运算符的行为,值为-Qold (默认), -Qwarn, -Qwarnall, 

    -Qnew之一

    -s
    阻止将用户站点目录追加到sys.path
    -S
    阻止包含site初始模块
    -t
    报告关于不一致的标签使用警告
    -tt
    由于不一致的标签使用而导致TabError异常
    -u
    未缓冲的二进制stdout和stdin
    -U
    Unicode字面量,所有字符串字面量都以Unicode形式处理(仅在Python2中使用)
    -v
    详细模式,跟踪导入语句

    -V

    打印版本信息
    -x
    跳过源程序的第一行
    -c cmd
    以字符串形式执行cmd

    2、doctest代码测试模块

      Doctest模块允许在文档字符串内嵌入注释以显示各种语句的期望行为,尤其是函数和方法的结构;此处的文档字符串看起来如同一个交互式shell会话;可用于测试文档是否与主程序保持同步,或基于文档对程序本身做测试。

     自定义测试模块test.py:

    [root@mylinux home]# cat test.py 
    #!/usr/bin/python3
    def add(num1,num2):
      '''
      >>> add(12,23)     #  '>>>'之后需要有一空格
      35
      '''
      return num1+num2

      使用doctest模块进行测试:

    In [1]: import test
    In [2]: import doctest
    In [3]: doctest.testmod(test)              #测试test.py模块
    Out[3]: TestResults(failed=0, attempted=1)
    In [4]: doctest.testmod(test,verbose=True)
    Trying:
        add(12,23)
    Expecting:
        35
    ok
    1 items had no tests:
        test
    1 items passed all tests:
       1 tests in test.add
    1 tests in 2 items.
    1 passed and 0 failed.
    Test passed.
    Out[4]: TestResults(failed=0, attempted=1)

      也可以直接定义自测试模块:

    [root@mylinux home]# cat test.py 
    #!/usr/bin/python3
    def add(num1,num2):
            '''
            >>> add(12,23)
            35
            '''
            return num1+num2
    if __name__ == '__main__':
            import doctest
            doctest.testmod()
    [root@mylinux home]# python3 test.py     #测试通过时不会显示任何信息
    [root@mylinux home]# python3 test.py -v  #输出详细信息
    Trying:
        add(12,23)
    Expecting:
        35
    ok
    1 items had no tests:
        __main__
    1 items passed all tests:
       1 tests in __main__.add
    1 tests in 2 items.
    1 passed and 0 failed.
    Test passed.

    3、Python的异常处理

      在一些编程语言中,错误是通过特殊的函数返回值指出的,而Python使用异常,它是只有错误发生时执行的代码。错误通常有:语法错误和逻辑错误两大类。

     语法错误:软件的结构上有错误而导致不能被解释器解释或不能被编译器编译。

     逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成、计算或者输出结果需要的

    过程无法执行等。

      在Python中异常是一个对象,表示错误或意外,检测到一个错误时,将触发异常。Python可以通过异常传导机制传递一个异常对象,发出一个异常情况出现的信号;程序员也可以在代码中手动触发异常。Python异常可以理解为:程序员出现了错误而在正常控制流以外采取的行为。这种处理可以分为两个阶段。

        第一阶段:解释器触发异常,此时当前程序流被打断;

        第二阶段:异常处理,如忽略非致命性错误、减轻错误带来的影响等。

      这种处理方式的主要作用有:

    错误处理:默认处理,停止程序,打印错误信息;使用try语句处理异常并恢复

    事件通知:用于发出有效状态信息

    特殊情况处理:无法调整代码去处理的现场

    终止行为:try/finally语句可确保执行必须的结束处理机制

    非常规控制流程:异常是一种高级跳转(goto)机制

    • 异常的检测与处理

      在Python中,异常通过try语句来检测,任何在try语句块里的代码都会被监测,检查有无异常。在本文中使用的是Python3作为演示。

      try语句的主要有两种形式:

    try-except:检测和处理异常。可以有多个except,支持使用else子句处理没有探测异常的执行代码

    try-finally:仅检测异常并做一些必要的清理工作。仅能有一个finally。

    try语句的复合形式:try-except-finally。

    try-except语句:

    try:
        try_suite
    except Exception [as reason]:
        except_suite
        
    In [1]: try:
       ...:     f1=open('/tmp/a.txt','r')
       ...: except IOError as e:
       ...:     print('Could nor open file',e)
       ...:     
    Could nor open file [Errno 2] No such file or directory: '/tmp/a.txt'

    try-except-else语句:

      except分句个数没有限制,但else只能有一个;没有异常发生时,else分句才会执行;没有符合的except分句时,异常会向上传递到程序中的之前进入的try中或者道程序的顶层。

    try:
        try_suite
    except Exception1 [as reason]:
        suite_exception1
    except (Exception1, Exception2 ,Exception3 ...)[, reason]:
        suite
        ...
    except:
        suite
    else:
        else_suite

    try-finally语句:

      无论异常是否发生,finally子句都会执行;常用于定义必须进行的清理工作,如关闭文件或断开服务连接等;finally中的所有代码执行完后会继续向上一层引发异常。

    try:
        try_suite
    finally:
        finally_suite

    try-except-else-finally语句:

    try:
        try_suite
    except Exception1:
        suite_exception1
    except (Exception1, Exception2 ,):
        suite23
    ...
    else:
        else_suite
    finally:
        finally_suite
    分句形式说明
    except:
    捕捉所有(其他)异常类型
    except name [as e]:
    只捕捉特定的异常
    except (name1,name2):
    捕捉所列出的异常

    else:

    如果没有异常就运行
    finally:
    总是运行此代码块

    4、自定义异常

     raise语句允许程序员强制抛出一个指定的异常。其语法格式为:

    raise[someexception [ ,arg [, traceback]]]

      someexception:异常的名字,仅能使用字符串、类或实例;

      args:以元组的形式传递给异常的参数;

      traceback:异常出发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常。

    In [9]: try:
       ...:     raise NameError('HiThere')     #定义异常
       ...: except NameError:
       ...:     print('An except flew by!')
       ...:     raise                          #触发异常
       ...: 
    An except flew by!
    --------------------------------------------------------------------------
    NameError                                Traceback (most recent call last)
    <ipython-input-9-9448df11d518> in <module>()
          1 try:
    ----> 2     raise NameError('HiThere')
          3 except NameError:
          4     print('An except flew by!')
          5     raise
    NameError: HiThere

      大多数的标准异常都是由StandError派生的,其中有3个抽象的子类:

    ArithmeticError

    由于算术错误引发的异常基类

    OverflowErrorZeroDivisionErrorFloatingPointError

    LookupError

    容器在接收到一个无效键或索引时引发异常

    IndexErrorKeyError

    EnvironmentError

    由于外部原因而导致的异常的基类

    IOErrorOSErrorWindowsError

    自定义异常类:

      自定义异常类通常分为两大类:

    自定义异常和多重继承:从定义异常类和标准异常类进行多重继承,例如:

      class customAttributeError(CustomException,AttributeError):

      pass

    标准库中使用的其它异常:如ArithmeticError、EnvironmentError等

    assert语句通常用于在程序中引用调试代码,语法格式为:

    assert  condition [, expression]

      如果condition条件满足,则assert不做任何操作;如果条件不满足,则assert作为参数实例化AssertionError并引发结果实例。

      如果运行python时使用了-O优化选项,assert将是一个空操作,编译器不为assert语句生成代码 。运行python不使用-O选项,则__debug__内置变量为True,否则为False。

      assert语句相当于下面代码:

    if  __debug__:
        if not condition :
            raise  AssertionError, <expression>
    In [17]: assert len(['my boy',12])>10    #条件len(['my boy',12])>10不满足依法默认异常
    --------------------------------------------------------------------------
    AssertionError                           Traceback (most recent call last)
    <ipython-input-17-cc0a09de885b> in <module>()
    ----> 1 assert len(['my boy',12])>10
    AssertionError: 
    In [18]: assert range(4)==[0,1,2,3]      #条件range(4)==[0,1,2,3]不满足依法默认异常
    --------------------------------------------------------------------------
    AssertionError                           Traceback (most recent call last)
    <ipython-input-18-8b7aafe34e9e> in <module>()
    ----> 1 assert range(4)==[0,1,2,3]
    AssertionError: 
    In [19]: assert 1==1                        #条件满足,无输出
    In [20]: assert range(4)==[0,1,2,3],IOError #条件不满足,自定义异常为IOError
    --------------------------------------------------------------------------
    AssertionError                           Traceback (most recent call last)
    <ipython-input-20-49011133d0d8> in <module>()
    ----> 1 assert range(4)==[0,1,2,3],IOError
    
    AssertionError: <class 'OSError'>


关键字