Scala - Разница между стратегиями обработки ошибок Supervisor и Try-catch - PullRequest
0 голосов
/ 14 января 2020

Может ли кто-нибудь объяснить разницу между стратегиями обработки ошибок "supervisor" и "try-catch" в ActorSystem в Scala?

1 Ответ

0 голосов
/ 15 января 2020

Try-catch может восстановиться после Exception, выданного в блоке try (при условии, что сообщение об ошибке выдается с помощью Exception). Он не привязан к актерам, но доступен для обработки ошибок в Scala (унаследовано от Java):

def method(arg: String): Int = try {
  arg.toInt
} catch {
  case _: Throwable => 0
}

Supervisor используется для решения, что делать, если Exception in наш код не был перехвачен или произошла какая-то другая ошибка, которая обычно означает что-то другое Exception, но не выдается и не обрабатывается нашим кодом - передача сообщения из одного кластера в другой, недопустимое внутреннее состояние и т. д. c.

Try-catch - это то, что вы можете использовать внутри своего собственного кода, чтобы убедиться, что метод будет успешным. Это очень локально по объему. Если вы не можете дать такую ​​гарантию и хотите сообщить ActorSystem, что делать с Actor, который не может самостоятельно обработать ошибку (или, возможно, даже с целой группой Actor s), тогда вы используете Supervisor - Supervisor, однако не можете просто поймайте Exception и убедитесь, что функция вернет нормальное значение. Он прикажет Actor перезапустить (с очисткой его состояния или с сохранением текущего состояния), навсегда убить Actor или перейти к родительскому объекту Actor.

Когда необходим надзор, это вполне хорошо объяснено в документации .

Упрощение работы с ошибками при обработке следует оставить для Actor, который внутренне исправляет ошибки, используя try - catch, Try, et c, тогда как Supervisor следует использовать с SupervisionStrategies для обеспечения отказоустойчивости , как в документации .

...