yui 发表于 2018-8-14 13:05:10

Python运行环境与异常处理

  1、Python的启动
  Python的命令格式:
python ... [-c cmd | -m mod | file | -] ...选项描述-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-UUnicode字面量,所有字符串字面量都以Unicode形式处理(仅在Python2中使用)-v详细模式,跟踪导入语句  -V
打印版本信息-x跳过源程序的第一行-c cmd以字符串形式执行cmd  2、doctest代码测试模块
  Doctest模块允许在文档字符串内嵌入注释以显示各种语句的期望行为,尤其是函数和方法的结构;此处的文档字符串看起来如同一个交互式shell会话;可用于测试文档是否与主程序保持同步,或基于文档对程序本身做测试。
  自定义测试模块test.py:
# cat test.py  
#!/usr/bin/python3
  
def add(num1,num2):
  
'''
  
>>> add(12,23)   #'>>>'之后需要有一空格
  
35
  
'''
  
return num1+num2
  使用doctest模块进行测试:
In : import test  
In : import doctest
  
In : doctest.testmod(test)            #测试test.py模块
  
Out: TestResults(failed=0, attempted=1)
  
In : 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: TestResults(failed=0, attempted=1)
  也可以直接定义自测试模块:
# cat test.py  
#!/usr/bin/python3
  
def add(num1,num2):
  
      '''
  
      >>> add(12,23)
  
      35
  
      '''
  
      return num1+num2
  
if __name__ == '__main__':
  
      import doctest
  
      doctest.testmod()
  
# python3 test.py   #测试通过时不会显示任何信息
  
# 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 :
  
    except_suite
  

  
In : try:
  
   ...:   f1=open('/tmp/a.txt','r')
  
   ...: except IOError as e:
  
   ...:   print('Could nor open file',e)
  
   ...:
  
Could nor open file No such file or directory: '/tmp/a.txt'
  try-except-else语句:
  except分句个数没有限制,但else只能有一个;没有异常发生时,else分句才会执行;没有符合的except分句时,异常会向上传递到程序中的之前进入的try中或者道程序的顶层。
try:  
    try_suite
  
except Exception1 :
  
    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 :只捕捉特定的异常except (name1,name2):捕捉所列出的异常  else:
如果没有异常就运行finally:总是运行此代码块  4、自定义异常
  raise语句允许程序员强制抛出一个指定的异常。其语法格式为:
raise]]  someexception:异常的名字,仅能使用字符串、类或实例;
  args:以元组的形式传递给异常的参数;
  traceback:异常出发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常。
In : 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
  由于算术错误引发的异常基类
  OverflowError、ZeroDivisionError、FloatingPointError
  LookupError
  容器在接收到一个无效键或索引时引发异常
  IndexError、KeyError
  EnvironmentError
  由于外部原因而导致的异常的基类
  IOError、OSError、WindowsError
  自定义异常类:
  自定义异常类通常分为两大类:
  自定义异常和多重继承:从定义异常类和标准异常类进行多重继承,例如:

  >  pass
  标准库中使用的其它异常:如ArithmeticError、EnvironmentError等
  assert语句通常用于在程序中引用调试代码,语法格式为:
assertcondition [, expression]  如果condition条件满足,则assert不做任何操作;如果条件不满足,则assert作为参数实例化AssertionError并引发结果实例。
  如果运行python时使用了-O优化选项,assert将是一个空操作,编译器不为assert语句生成代码 。运行python不使用-O选项,则__debug__内置变量为True,否则为False。
  assert语句相当于下面代码:
if__debug__:  
    if not condition :
  
      raiseAssertionError, <expression>
In : 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 : assert range(4)==      #条件range(4)==不满足依法默认异常
  
--------------------------------------------------------------------------
  
AssertionError                           Traceback (most recent call last)
  
<ipython-input-18-8b7aafe34e9e> in <module>()
  
----> 1 assert range(4)==
  
AssertionError:
  
In : assert 1==1                        #条件满足,无输出
  
In : assert range(4)==,IOError #条件不满足,自定义异常为IOError
  
--------------------------------------------------------------------------
  
AssertionError                           Traceback (most recent call last)
  
<ipython-input-20-49011133d0d8> in <module>()
  
----> 1 assert range(4)==,IOError
  

  
AssertionError: <class 'OSError'>
页: [1]
查看完整版本: Python运行环境与异常处理