python程序在非python环境中运行_Python运行环境与异常处理

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

-UUnicode字面量,所有字符串字面量都以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)

in ()

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

自定义异常类:

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

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, In [17]: assert len(['my boy',12])>10 #条件len(['my boy',12])>10不满足依法默认异常

--------------------------------------------------------------------------

AssertionError Traceback (most recent call last)

in ()

----> 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)

in ()

----> 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)

in ()

----> 1 assert range(4)==[0,1,2,3],IOError

AssertionError:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值