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 для обеспечения отказоустойчивости , как в документации .