发生异常时如何重复代码? [复制]

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 子句(如果引发的Exceptionexcept 上声明的匹配)

编辑与 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 哦,是的,对.. 它比我更复杂 :-)

以上是关于发生异常时如何重复代码? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

订阅发生异常代理消息代码 20598,个人总结

当所选项目的值发生变化时如何运行javascript代码[重复]

发生异常时如何正确关闭资源流

创建分支时如何获取提交[重复]

运行时异常,递归太深

Python:如何忽略异常并继续? [复制]