Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Например, в языке Scala для этого используется определенный класс Try.
Try не самый удобный инструмент для обработки ошибок в Scala, см. например github.com/scala/bug/issues/6284. Лично мне больше по душе тайпкласс MonadError, где ошибка параметризована. def doSth[F[_]: MonadError[?[_], Throwable]](): F[Int] = for {
i <- Applicative[F].pure(10)
} yield i + 1
Try в качестве F не получится, т.к. Try нарушает правила функтора. А вот Either очень даже подойдет: doSth[Try]() // не компилируется, нет нужного инстанса, т.к. нарушено правило
doSth[Either[Throwable, ?]]() //Ok
Try в функциональном как минимум проблематичным.def inputStreamForURL(url: String): Try[Try[Try[InputStream]]]def inputStreamForURL(url: String): Try[Try[Try[InputStream]]] = parseURL(url).map { u =>
Try(u.openConnection()).map(conn => Try(conn.getInputStream))
}Try[Try[Try просто ужасен, можно ведь просто написать:
def inputStreamForURL(url: String): Try[InputStream] = Try {
parseURL(url).map(_.openConnection()).map(_.getInputStream())
}У этих методов совершенно разная семантика. Throw это не просто результат функции, а именно раннее завершение всей цепочки вызовов до соответствующего catch-блока. Expected/Try — это урезанная семантика checked exception, в которой нельзя например выкидывать эксепшны разного типа (throws E1, E2). Так делается, потому что во многих функциональных языках нет другой альтернативы. В Java функциональщина всегда будет являться инородным телом и добавит бойлерплейта.
Обработка ошибок в функциональном стиле в Java