1

我将连接的应用程序逻辑全部包裹在一个大的 try/except/finally 块中:

async def serve(self, stream: trio.SocketStream):
    try:
        async with trio.open_nursery() as nursery:
            pass  # code goes here to do some reading and writing 

    except Exception as e:
        print("Got exception:", e)
    except trio.Cancelled:
        print("Cancelled")
        raise
    # some other handlers, mostly just logging

    finally:
        # ... some other stuff ...
        # ... then shut the connection:
        with trio.move_on_after(1):
            await stream.aclose()

我不清楚是否应该尝试在 finally 子句中关闭连接。如果异常是由于应用程序错误(来自连接的无效消息,或协程被取消),这似乎是正确的做法,但如果异常是连接从另一端关闭,那么这似乎适得其反 - 我期望旧的异常会被新的异常掩盖。有什么想法吗?我也许可以将它包装在自己的 try/except 中,而忽略任何异常。

4

1 回答 1

1

在 python-trio/general Gitter 聊天中,Joshua Oreman @oremanj 友好地提供了这个答案:

Trio 区分本地关闭和远程关闭。如果连接被远程端关闭,仍然可以 aclose() 它。(正是因为这个原因)

(如果它在本地被 aclose(),再次 aclose() 也是可以的。在任何一种情况下,它都是一个 noop(除了执行检查点)。)

如果ClosedResourceError您在关闭连接后使用连接(这是您应该修复的编程错误),而不是BrokenResourceError在另一端发生某些问题后使用连接(有时由于变幻莫测),您会得到网络)。

于 2020-09-15T08:52:21.427 回答