Использование опробовать вне контекста исключения - PullRequest
0 голосов
/ 07 июля 2019

Допустимо ли в Scala использование Try (Success / Failure) вне фактического Exception контекста в качестве возвращаемого типа функции, которая может завершиться или завершиться неудачей?

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

Конечно, возможно использовать Try вне контекста исключения; Я использую это все время. Это не обязательно означает, что это "приемлемо":)

Я бы сказал, что весь смысл использования Try состоит в том, чтобы вынуть экземпляр Throwable из контекста исключения и поместить его в объект, который можно использовать в любом месте программы. Трудно понять, почему Try имел бы такой богатый набор методов (например, flatMap), если он предназначен только для использования в контексте исключения.

3 голосов
/ 07 июля 2019

Экземпляры Try, либо Success, либо Failure, где Failure равно

case class Failure[+T](exception: Throwable)

Обратите внимание, как Failure должен быть построен с Throwable, поэтому я думаю, что Try предназначен для использования в контексте Throwable s. Поэтому мы не можем сделать что-то вроде

def foo: Try[Int] = {
  Failure(42) // Error: type mismatch; found : Int(42) required: Throwable
}

Попробуйте использовать Either вместо Try вне контекста исключений.


При рассмотрении комментария рассмотрим

  • Valid/Invalid от кошек: https://typelevel.org/cats/datatypes/validated.html
  • определите свой собственный ADT с вашим собственным значением случаев успеха и неудачи, а затем оберните результаты функции в этих случаях

Ни в одном из них вы не обязаны использовать исключения.

Вот пример

sealed trait MyValidationADT[T]
case class Good[T](result: T) extends MyValidationADT[T]
case class Bad[T](result: T) extends MyValidationADT[T]

def foo(i: Int): MyValidationADT[Int] = Bad(42)

foo(11) match {
  case Good(result) => "woohoo"
  case Bad(result) => "boom"
}

который выводит

res0: String = boom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...