解析媒体矩阵(MediaMatrix)(四十九)NWare软件应用(11)——Python编程基础(续5)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
12 函数的参数
在《音响技术》第7期“函数”的学习中最后讲到了一个自动转发电子邮件的Python脚本mail(a),其中的(a)就是自定义函数mail的一个参数,函数的参数可以是多个,用逗号隔开。
函数在调用参数时会依次接收。
例如在日常的NION推广活动中,会演示一些NWare 的软件功能,软件的控制特性在Emulated模式下基本上是可以实现的,但是没有连接NION主机的情况下,音频通道的通路没有电平显示,整体的演示功能就没有那么好看,如在此做一个电平显示的模拟程序,可以让一个纯软件的NWare看起来比较美观,如图1。
这个小程序的功能就是使用一个随机函数发生器,产生一个随机的数字推动电平表显示。
左边的两个旋钮分别是设置这个随机数字发生器的最大值和最小值。
脚本为:import random #导入随机函数模块
def meter(min,max): #定义一个函数meter包含
两个控制参数
min=inputs[0].value_get()
#最小值和最大值从输入旋
钮提取
max=inputs[1].value_get()
a=random.randrange(min,max)
#给定范围内产生一个随机数
return a #将这个随机数返回并输出
while 1:
event.wait(200) #电平表的更新速度
d=meter(min,max) #导入函数meter,并输出
outputs[0].string_set(d)
这个函数包含了两个参数min和max,分别代表了random模块要求的随机参数最小量和最大量。
脚本里面的循环片段添加的event.wait(200),表示每次重复电平循环时,中间暂停200 ms,一方面可以让电平表输出跳动不会太剧烈,更主要的是可以减少很多的数据量。
当作这种循环的时候,要把脚本程序设定到多线程模式下,方法是图1右键的Random_full模块选择Device Properties 并勾选threaded选项,此时才能完成event.wait()功能。
这个脚本只是告诉大家如何去使用函数的参数设定功能。
如果参数设定得正确,那么脚本就可以稳定地运行起来。
但是如果出现意外情况,Python解释器可能无法解释参数的特性,导致程序终止。
例如当输入的最小随机变量min参数比最大随机变量max还要大时,random模块将无法做出判断,从而产生异常;另外一种情况就是random模块只能接受整数类型的参数,如果输入了小数类型(浮点数据),那么python 解释器同样会产生异常并停止运行。
因此在设定min 和max参数时要格外小心,不能出现以上两种情况,否则就要重新编译文件运行。
任何编程语言在运行的过程中都可能会出现异常,那么对异常数据的处理就显得非常必要了。
在C
解析媒体矩阵(MediaMatrix)(四十九)
NWare软件应用(11)——Python编程基础(续5)图1 用脚本编写一个电平表模拟程序
语言中,头文件可以设定包含可捕获的错误数,但是一般都是用在多层的if或者switch语句中;C++虽然支持异常系统,但是很多的应用并不充分。
包括C/C++在内的很多的语言都没有很好的方法用于执行捕获单独语句的执行错误。
但是Python却提供了一种不同的方法,在发生错误的时候会引发异常,并可以使用内置语句引发并捕获异常,从而安全地处理。
下面就仔细研究一下有关异常的捕获问题。
13 异常与异常捕获
异常(Exception)是一种特殊的Python对象,它可以向模块调用者传递调用信息失败。
异常发生后还可以捕获该异常,异常信息则传递到异常处理器中。
和C语言所不同的是,Python可以获得问题的准确描述,甚至可以获得已发生错误的额外信息。
对于图1所示的例子,如果将左侧旋钮旋转出一个非整数的小数时,那么Python就会停止运行,并产生异常。
可以在Random_full脚本框的错误提示框Error中看到如下字样:
ValueError: non-integer arg 1 for randrange()
这表示在“randrange()”方法中引入了一个非整数的数值参数错误,这种报错称为异常,冒号前面的“ValueError:”称为异常的类型。
通常来说如果解释器发生异常,那么它就会停止运行。
对异常进行捕获的目的就是要“通知”Python解释器,如果发生了异常,则按照另外一种方式去解决这个问题,而不要终止解释器。
增加了异常捕获的脚本程序如下:
import random #导入random模块
def meter(min,max): #定义函数meter()
min=inputs[0].value_get() #写入参数
max=inputs[1].value_get()
if max > min: #只有当最大值大于最
小值的时候
try: #异常捕获
a=random.randrange(min,max)
#设定范围产生随机数a
except ValueError: #设定需要捕获的异常
类型
min=int(min) #出现异常时小数取整
max=int(max)
return random.randrange(min,max)
#重新生成随机数a
else: #若没有出现异常
return a #则不处理返回随机数a
else: #如果max参数不比min
大的话,则输出以下信息 message.string_set('The Max parameter must be more than Min')
return -100 #返回-100的意思就
是要电平表到最小值while 1:
event.wait(200)
d=meter(min,max)
outputs[0].string_set(d)
一般来说,用于处理异常的try语句,有两种不同的形式:try……except……else 和 try……finally。
第一种形式上面已经举例,如果只是跟踪异常而不作任何的处理,那么就使用第二种形式更为简洁。
先总结一下最常用的第一种异常捕获形式:
try:
BLOCK
except [EXCEPTION [,DATA……]]:
BLOCK
else:
BLOCK
上述异常捕获的格式是一种固定的模式,正常运行的时候,当Python解释器遇到try则表示进入异常捕获状态,执行以下操作。
(1)首先执行try下面的BLOCK语句块,如果引发解释器的异常,则执行过程立刻转移到except语句进行异常类型匹配。
(2)如果上述异常和指定的EXCEPTION匹配(如果这里没有定义任何的EXCEPTION,表示通用异常,也就是任何异常都适用),则执行对应的BLOCK语句块,DATA也是一个可选参数,这种异常返回不常用。
上例中指定的EXCEPTION异常是:ValueError,所以
当输入一个小数时,Python解释器返回了ValueError 异常,此时就会运行下面的语句块,也就是把输入的小数转换成整数类型,并返回输出给函数。
(3)如果所引发的异常不匹配,那么执行下一个except语句。
也就是说异常的匹配条件except语句可以任意多的。
(4)如果任何一个except语句都没有匹配的话,那么这个异常会被传递到高层的try代码块中,要注意,此时的异常并没有解决,而是完整的传递过去。
(5)若没有发生任何异常,则执行else代码块。
上述的5个执行步骤还有几点需要额外注意。
一是当except匹配一个异常时使用
except ValueError:
这样的格式,当一个except同时需要匹配多个异常类型时,要用添加括号来表示,例如
except (ValueError,TypeError):
第二个需要注意的是,Python是按照先后顺序去检查except以确定异常的匹配问题,这个检查是按照先后的顺序的。
Python不会一次检查所有的except句子,这就意味着可能一些except根本就没有检查就已经返回调用了。
第三个要注意的是,在一次运行Python的过程中,异常处理器只运行一次,try……except……else语句只允许匹配一次,一旦执行过一次异常代码块,则整个异常的捕获完成,程序回到try语句块后面的语句中。
再说一下第二种异常捕获形式:
try:
BLOCK
finally:
BLOCK
执行try……finally语句的规则如下。
(1)执行try BLOCK中的语句。
(2)如果发生异常,则该异常传递到下级之前,执行finally BLOCK。
(3)如果没有发生异常,则执行finally BLOCK,直到try语句结束。
从这个规则可以看出,不论是不是发生异常,它的执行顺序都是一样的。
在一些例子中,如果只是运行一段代码,而无论是不是有异常产生都要按照相同的结果输出,那么try……finally这个句子就非常有用。
例如,通过NION主机登陆远程服务器进行通信时,需要定时去捕获错误,这样做的目的是确保线路畅通,以便在真正需要通信的时候使用。
由于平时这个动作只是去探查线路的健康状态,而并没有需要进行通信,所以无论线路是否健康,都要关闭这个通道的通信,那么这个异常的捕获过程为:
try:
remote.send_data(destination,datastream)
finally:
remote.close_connection()
这样就做到了无论通信链路是否有正确响应,都要关闭这个通道。
但是try……finally语句并没有真正处理这个异常,也就是说如果通信链路的返回信息出现异常,它是无法进一步处理的。
但是这个异常并没有消失,而是自动传递到下一级,因此可以使用try语句的嵌套结构去捕获这个异常,并做出响应的动作,代码如下:try:
try:
remote.send_data(destination,datastream)
finally:
remote.close_connection()
except NetworkError,errorstr:
message.string_set(“Error: Couldn’t send connection data,”errorstr)
else:
message.string_set(“Connection successful”)
这个例子一方面了解了try语句的嵌套方法,另一方面了解了try……finally语句结构的用法。
如果try捕获到了异常,说明网络通信有一些问题,Python会报出网络返回错误“NetworkError”,同时从系统接口程序获得了此次通信的错误代码“errorstr”,并将这个代码粘贴在NWare的信息窗口。
这里的错误代码就是开始探讨try……except……else语句结构时,里面包含的可选参数[,DATA……]一类的选项。
“errorstr”只是“NetworkError”的一个参数,并不是另外一个异常,所以只是使用逗
号分隔开,而不是使用小括号将两个参数括起来。
解析媒体矩阵(MediaMatrix)(四十九)NWare软件应用(11)——Python编程基础(续5)
作者:兆翦
作者单位:
刊名:
音响技术
英文刊名:AV TECHNOLOGY
年,卷(期):2008(8)
本文链接:/Periodical_yinxjs200808004.aspx。