Exception handling 试演演员总是坏习惯吗?

Exception handling 试演演员总是坏习惯吗?,exception-handling,akka,actor,Exception Handling,Akka,Actor,我知道演员的越位处理通常应该采用主管策略。但这是否适用于所有情况 示例 有一个参与者是某种数据库 有几个源参与者可以向数据库参与者添加数据 这些参与者的父子关系未知 要向数据库参与者添加数据,必须在数据库参与者处注册源参与者 如果未注册的源参与者试图向数据库添加数据,则会引发异常 如果我严格遵循akka演员的错误处理策略,那么监督演员就必须处理这个案例 我更希望捕获数据库参与者内部的异常,并向源参与者发送一条消息,说明出现了问题。然后源参与者可以做出反应(注册到数据库并重试) 这是一种好的做

我知道演员的越位处理通常应该采用主管策略。但这是否适用于所有情况

示例

  • 有一个参与者是某种数据库
  • 有几个源参与者可以向数据库参与者添加数据
  • 这些参与者的父子关系未知
  • 要向数据库参与者添加数据,必须在数据库参与者处注册源参与者
  • 如果未注册的源参与者试图向数据库添加数据,则会引发异常
如果我严格遵循akka演员的错误处理策略,那么监督演员就必须处理这个案例

我更希望捕获数据库参与者内部的异常,并向源参与者发送一条消息,说明出现了问题。然后源参与者可以做出反应(注册到数据库并重试)


这是一种好的做法吗?还是整个演员设置错误?如果首选主管策略,那么应该如何实施它?

捕获异常并在您认为合适时将其转化为响应是非常好的。我建议使用Scala,如:


或者类似的东西(您也可以
try.failed.map{ex=>doThings(ex)}
),这取决于您的样式首选项。

在这种情况下为什么需要抛出异常?您只需发送正确的答案或发布正确的事件,数据库参与者使用的基础数据库就会抛出异常。因此,要么捕获异常并发送消息,要么使用主管策略。但您声称可以检查smb是否直接在db actor持有的寄存器列表中注册。因此,如果没有-不要向db发送任何请求,只使用“unauthorized”消息等进行响应。数据库不能,但我可以将其存储在actor本身中。但除了语法之外,这与try-catch并没有什么不同。所以只有当意外事件发生时,我们才是监督演员?@hami我同意你的看法。我的经验法则是这样的:捕获预期的异常并在可能的情况下处理它们。如果不可能或异常是意外的,让参与者崩溃并让主管处理。
Try(dangerousOperation()) match {
  case Success(res) => sender() ! res
  case Failure(ex)  => sender() ! UnableToStoreThingy("reasons...", ex)
}