Python 循环内的Jython异常处理

Python 循环内的Jython异常处理,python,exception-handling,jython,automated-tests,Python,Exception Handling,Jython,Automated Tests,我正在使用Marathon2.0b4自动化应用程序的测试 Marathon提供的脚本元素之一wait\u p的一个缺点是其默认超时时间是硬编码的为60秒。由于应用程序的加载时间较长,我需要更长的超时时间。 [我考虑过修补Marathon,但不想维护并行版本等,因此认为更好的解决方案实际上是测试脚本级别的一种变通方法。] def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None): from ma

我正在使用Marathon2.0b4自动化应用程序的测试

Marathon提供的脚本元素之一
wait\u p
的一个缺点是其默认超时时间是硬编码的为60秒。由于应用程序的加载时间较长,我需要更长的超时时间。
[我考虑过修补Marathon,但不想维护并行版本等,因此认为更好的解决方案实际上是测试脚本级别的一种变通方法。]

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    """Wrapper around wait_p which takes exactly the same parameters as wait_p,
    except that an extra first parameter is used to specify the number of times
    wait_p is called"""
    for i in range(1, times):
        try:
            wait_p(compID_name, ppty_name, ppty_value, compID_cell)
        except:
            if (i < times):
                print "wait_p failed, trying again"
            else:
                raise
def wait_p_long(时间、compID_名称、ppty_名称、ppty_值、compID_单元格=无):
从marathon.playback导入*
“”“Wrapper-around wait\u p,它采用与wait\u p完全相同的参数,
除了一个额外的第一个参数用于指定次数之外
等等,p被称为“”
对于范围内的i(1,次):
尝试:
等待p(compID\u名称、ppty\u名称、ppty\u值、compID\u单元格)
除:
如果(i<次):
打印“等待失败,重试”
其他:
提升
wait_p
是“wait property”的缩写,它接受3个强制参数和一个可选参数(参数的名称是不言自明的),它所做的是等待指定组件的特定属性等于指定值

上面的方法(Jython)打算做的是使用一个额外的参数,
times
,它指定尝试的次数
wait\p
,将异常抑制到最后一次尝试

然而,这种方法对我不起作用,我担心其中可能有一些语法或逻辑错误。python/jython大师对此有何评论

谢谢

有两件事:

  • 范围(1,次)
    几乎肯定应该是
    范围(次)
    ;您编写的内容相当于(inti=1;ifor
  • 由于我刚才解释的原因,
    if(I
    块中总是
    True
如果这对你的问题没有帮助,请描述你的结果与你的预期有多大的不同

结果将类似于:

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    """
    Wrapper around wait_p which takes exactly the same parameters as wait_p,
    except that an extra first parameter is used to specify the number of times
    wait_p is called.
    """
    for i in range(times):
        try:
            wait_p(compID_name, ppty_name, ppty_value, compID_cell)
        except:
            if i == times - 1:
                raise
            else:
                print "wait_p failed, trying again"

@汉克的解释是正确的,但我建议采用另一种方法:

def wait_p_long(times, compID_name, ppty_name, ppty_value, compID_cell=None):
    from marathon.playback import *
    for i in range(times-1):
        try:
                wait_p(compID_name, ppty_name, ppty_value, compID_cell)
                break
        except:
                pass
     else:  # try one last time...!
         wait_p(compID_name, ppty_name, ppty_value, compID_cell)

它在概念上对我来说更简单(虽然
wait\p
调用的文本重复是负号,但它避免了检查
i
以“最后一次”做不同的事情)。如果循环中没有执行过
break
,循环上的
else
子句就会执行,顺便说一句。

我现在感觉像这样一个n00b!为了澄清您的建议:1)将
范围(1次)
更改为
范围(次)
,2)将
如果(i
更改为
如果(i
;为了捕捉for循环的最后一次出现?谢谢Alex,但我想我更喜欢Hank的解决方案+还是给你一个!好的,但是当前编码的解决方案是错误的——测试
if(i==times):
,除了多余的括号外,永远不会得到满足,所以
提升
永远不会发生。关键不在于这个特定的bug,它当然是可以修复的:而是你和Hank使用的编码方式很容易出现bug——只不过很容易就有一个bug。按照我建议的方式进行编码(顺便说一句,感谢+1)只是不太容易出现bug——这就是为什么您应该更喜欢它;-)。再过几十年,你就会知道哪些习惯用法和方法不太容易出现bug,你会更喜欢它们@Alex感谢您指出错误;我会马上修好的。作为记录,我更喜欢你的方法,但我试图让bguiz的例子在最小的概念变化下工作。