发生异常时如何重复代码? [复制]
Posted
技术标签:
【中文标题】发生异常时如何重复代码? [复制]【英文标题】:How to repeat code when exception happens? [duplicate] 【发布时间】:2022-01-23 20:09:53 【问题描述】:我想连接两台电脑,但是当其中一台电脑没有打开时,我收到连接被拒绝的异常,因为另一台电脑没有打开,所以我想当这个异常发生时我只是重新-执行此部分直到成功,等其他PC开机时。
这就是我所拥有的:
def main():
s = socket.socket()
host = "Alex-PC"
port = 8080
s.connect((host,port))
if traceback.format_exception(ConnectionRefusedError):
main()
我认为if
语句可能有效,但我不知道如何为这个问题编写if
语句。
【问题讨论】:
你读过tutorial了吗? 您的错误是专注于“回溯”一词。回溯是附加到异常的信息,告诉您错误发生的位置。您正在寻找的是“异常处理”。 这里您可能还需要小心,因为递归调用main()
会以惊人的速度达到默认阈值。
您还应该阅读this earlier part of the tutorial,它教您如何重复内容。
更多完整示例请参见***.com/questions/23294658/…。
【参考方案1】:
当你想处理一个异常(比如ConnectionRefusedError
)时,你应该使用Try/Except子句。
这将尝试执行try
内的代码,如果失败,它将执行except
子句(如果引发的Exception
与except
上声明的匹配)
编辑与 cmets 的建议:
在您的具体情况下,您可以执行以下操作:
import threading
import socket
t = 1
def connect(s, host, port):
try:
s.connect((host,port))
except:
print(f"Host host is not available. Retrying in t seconds...")
time.sleep(t)
t*=2
connect(s, host, port)
def main():
s = socket.socket()
host = "Alex-PC"
port = 8080
connect(s, host, port)
【讨论】:
请注意,您可能不想像这样递归调用connect()
,因为 python 的默认深度仅为 1000。因此,如果您正在等待第二台 PC 开机,这将一眨眼就达到递归深度。
这将引发NameError
,因为port
未定义。此外,except-block 将引发 TypeError
,因为在调用 connect
时没有所需的参数。
你是对的。已编辑。我只是想向他们展示 try/except 子句,我没有在意细节
@Latra 您还没有修复所有错误。两个connect
调用都缺少参数,time.sleep
将调用NameError
。但是像这样递归调用connect
仍然是一个非常糟糕的主意。只需在 main
中使用 for 循环。【参考方案2】:
调用函数时可以使用这个方法:
temp = 1
def main():
s = socket.socket()
host = "Alex-PC"
port = 8080
s.connect((host,port))
temp = 0
while(1):
if temp == 1:
try:
main()
except:
temp = 1
elif temp == 0: break
【讨论】:
@JonSG 实际上,它创建了一个无限循环,因为temp
是全局的,所以它永远不会被设置为零,while 循环也永远不会中断。
@ekhumoro 哦,是的,对.. 它比我更复杂 :-)以上是关于发生异常时如何重复代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章