2016-04-14 76 views
0

我正在为自动过程编写脚本。测试使用通过Paramiko的SSH连接,并且出于任何原因(与系统相关)系统重新启动,这会关闭SSH连接。然后Python发出一个错误,表示连接被强制关闭。Python跳出异常声明并继续

我希望程序在except语句中捕获错误,然后它将恢复ssh连接,然后从第一次出现错误的位置继续。

的代码太长发布但本质上,我希望做到以下几点:

try: 
     dotesting() 
except ParamikoError(): 
     restoressh() 
     #here i want to break out and get back into dotesting() 

我不知道这是可能因为“GOTO”是在不使用皱起了眉头在Python中。我会如何执行此操作?

编辑
所以我最初想做的是不可能的。现在我正在把重点转向重新启动的一个具体步骤中dotesting()

def dotesting(): 
     try: 
      stepone() 
     except ParamikoError(): 
      #Need to restart step here, want to flow into steptwo() below 
     try: 
      steptwo() 
     except ParamikoError(): 
      #Need to restart step here, want to flow into the return statement below 
     return("Success") 
+0

你不能回到异常出现的地方,没有。您最多可以*重新启动*'dotesting()'。只需使用一个循环。 –

+3

否则,您必须重构'dotesting()'以打破通过SSH运行的步骤,以便您可以在每个步骤捕获异常并重新启动该步骤。 –

+0

@MartijnPieters这是有道理的。我已经更新了该问题以反映您已提出的建议,因为这可以适用于我的案例 – bladexeon

回答

0

一个非常糟糕的答案就是编写程序,然后将其保存为一个字符串列表,其中列表中的每个项目为你的程序的行。然后做类似如下:

i =0 
while i<len(program) 
try: 
    eval(program[i]) 
    i+=1 
except ParamikoError(): 
    pass 

就像我说的,非常糟糕的解决方案,但我想不出任何更好的。

+0

为什么选择字符串?为什么不能使用对象?只要把它们放在一个列表中,然后调用每一个,并传入ssh连接。 –

0

如果每次你不应该抛出异常模拟SSH接口。否则,你可以这样做:

def stepone(): 
    raise AttributeError 

def steptwo(): 
    return 1 

class TestStuff(unittest.TestCase): 

    def test_steps(self): 
     with self.assertRaises(AttributeError): 
      stepone() 
     self.assertEquals(steptwo(), 1) 

if __name__ == '__main__': 
    unittest.main()