gpt4 book ai didi

python - 为什么 asyncio 在没有任何消息的情况下引发 TimeoutError?

转载 作者:太空宇宙 更新时间:2023-11-04 09:39:18 36 4
gpt4 key购买 nike

我在这段代码中遇到了一个小问题:

try:
return await asyncio.wait_for(tcp_command(cmd), timeout=timeout)
except (OSError, asyncio.TimeoutError) as err:
print(f"Network problem: {err}")

当超时发生时,它只打印“网络问题:”。它是由附加到引发的 asyncio.TimeoutError 的空值引起的:

# inside wait_for():
raise futures.TimeoutError()

单独处理 TimeoutError 很容易,但我发现原来的构造非常惯用,现在一个核心库打破了它。有充分的理由吗?我的假设 - 打印异常应该让我们知道哪里出了问题 - 正确吗?

最佳答案

Is there a good reason for it?

是的,您希望从 TimeoutError 中得到什么样的消息? “发生超时”?异常本身是不言自明的,不需要这样的冗余。

Is my assumption - that printing an exception should give us a clue what went wrong - correct?

是也不是。线索?是的。完整信息?否。异常消息不是强制性的。异常的类型也是一个重要的信息。在许多情况下,甚至超过消息本身。

所以首先:使用 print 从一开始就是错误的。 Python 具有非常丰富的日志记录支持。例如 logger.exception(str(exc)) 解决了您的问题,因为除了消息之外,它还记录了整个回溯。至少在默认情况下,它是可以自定义的。

但是如果你仍然想使用 print 然后考虑记录整个回溯:

import traceback
# traceback.print_exc()
print(traceback.format_exc())

如果整个回溯太大,那么您总是可以简单地打印异常的类名:

# print(f'[{type(exc).__name__}] {exc}')
print(f'[{type(exc)}] {exc}')

或按异常(exception)情况定制:

try:
return await asyncio.wait_for(tcp_command(cmd), timeout=timeout)
except OSError as err:
print(f"Network problem: {err}")
except asyncio.TimeoutError:
print('Timeout occured')

关于python - 为什么 asyncio 在没有任何消息的情况下引发 TimeoutError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52257101/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com