【发布时间】:2015-08-07 15:03:08
【问题描述】:
我知道演员中的异常处理通常应该使用主管策略来完成。但这对所有情况都有效吗?
示例
- 有一个演员是某种数据库。
- 有几个源 Actor 可以将数据添加到数据库 Actor。
- 这些演员的父子关系未知。
- 要将数据添加到数据库参与者,源参与者必须在数据库参与者中注册。
- 如果未注册的源参与者尝试向数据库添加数据,则会引发异常。
如果我严格遵循 akka Actor 的错误处理策略,那么监督 Actor 将不得不处理这种情况。
我更愿意在数据库参与者中捕获异常并向源参与者发送一条消息,指出出现问题。然后源参与者可以做出反应(注册到数据库并重试)。
这是一个好习惯吗?还是整个演员设置错误?如果首选主管策略,应该如何实施?
【问题讨论】:
-
为什么在这种情况下需要抛出异常?您可以发送正确的答案或发布正确的事件
-
数据库参与者使用的底层数据库引发异常。因此,要么捕获异常并发送消息,要么使用主管策略。
-
但您声称可以检查 smb 是否直接在 db actor 持有的寄存器列表中注册。所以如果不是 - 不要向 db 发送任何请求,而只是用“未授权”消息等响应。
-
数据库不能,但我可以将它存储在演员本身。但这与 try catch 并没有什么不同,除了语法。所以只有当意外发生时才使用监督演员?
-
@hami 我同意你的看法。我的经验法则是这样的:捕获预期的异常并尽可能处理它们。如果不可能或异常是意料之外的,让actor崩溃并让supervisor处理。
标签: exception-handling akka actor