Использование Either для обработки сбоев в коде Scala

Option Монада - отличный выразительный способ иметь дело с чем-то или ничем в Scala. Но что делать, если нужно зарегистрировать сообщение, когда «ничего»? происходит? Согласно документации Scala API,

The Either type is often used as an alternative to scala.Option where Left represents failure (by convention) and Right is akin to Some.

Однако мне не повезло найти лучшие практики, использующие Либо, либо хорошие примеры из реальной жизни, в которых Либо для обработки ошибок Наконец, я придумал следующий код для моего собственного проекта:

    def logs: Array[String] = {
        def props: Option[Map[String, Any]] = configAdmin.map{ ca =>
            val config = ca.getConfiguration(PID, null)
            config.properties getOrElse immutable.Map.empty
        }
        def checkType(any: Any): Option[Array[String]] = any match {
            case a: Array[String] => Some(a)
            case _ => None
        }
        def lookup: Either[(Symbol, String), Array[String]] =
            for {val properties <- props.toRight('warning -> "ConfigurationAdmin service not bound").right
                 val logsParam <- properties.get("logs").toRight('debug -> "'logs' not defined in the configuration").right
                 val array <- checkType(logsParam).toRight('warning -> "unknown type of 'logs' confguration parameter").right}
            yield array

        lookup.fold(failure => { failure match {
            case ('warning, msg) => log(LogService.WARNING, msg)
            case ('debug, msg) =>   log(LogService.DEBUG, msg)
            case _ =>
        }; new Array[String](0) }, success => success)
    }

(Обратите внимание, что это фрагмент из реального проекта, поэтому он не будет компилироваться самостоятельно)

Я был бы признателен за информацию о том, как вы используетеEither в вашем коде и / или лучшие идеи по рефакторингу приведенного выше кода.

Ответы на вопрос(4)

Ваш ответ на вопрос