跳到主要内容

错误

所有异常都继承自 SignalRError(它本身继承 Exception),因此用一个基类即可 捕获所有库错误。

Exception
└── SignalRError
├── ProtocolError
├── HubException
├── ConnectionClosed
├── ServerTimeout
├── HandshakeTimeout
├── InvocationCanceled
└── NegotiationError

SignalRError

所有 aiosignalr 错误的基类。

ProtocolError

收到畸形或违反规范的消息。对它所在的连接是致命的:客户端记录日志并关闭传输。

HubException

远程端点的 hub 调用失败。

  • 客户端Completion 携带错误时由 invoke() / stream() 抛出 (如 hub 方法抛错,或方法不存在)。
  • 服务器:在 hub 方法中抛它,向客户端发送特定错误消息(其 str() 原样传输)。

ConnectionClosed

操作在途时底层连接关闭。

  • CONNECTED 状态调用 invoke() / stream() / send() 时抛出。
  • 传输意外关闭且没有重连策略(或状态化重连失败)能恢复挂起调用时抛出。

ServerTimeout

远端在配置的 server_timeout 内停止发送消息。客户端随后关闭连接。

HandshakeTimeout

hub 握手未在 handshake_timeout 内完成。

InvocationCanceled

调用在完成前被取消(例如调用中途连接被停止)。

NegotiationError

POST /negotiate 握手失败(状态异常、非 JSON 响应、服务器错误属性、重定向过多)。

捕获错误

from aiosignalr.errors import ConnectionClosed, HubException, SignalRError

try:
result = await connection.invoke("add", 1, 2)
except HubException as exc:
print("the server rejected the call:", exc)
except ConnectionClosed as exc:
print("the connection was lost:", exc)
except SignalRError as exc: # 捕获其余所有
print("some other aiosignalr error:", exc)