Проблема в том, что в случае исключения нет значения для возврата. Поэтому вам нужно решить, какую ценность вернуть в таком случае. Это может быть пустой список (если вы действительно не заботитесь об обработке ошибки - не рекомендуется!):
def method1(arg: String*): List[String] =
try {
new MyClass(new URL(arg(0)))
.map(x => x.getRawString.toString)
} catch {
case e: Exception => { e.printStackTrace(); Nil; }
}
Стандартный Scala способ будет возвращать Option
, что делает его ясно вызывающему, что случилось:
def method1(arg: String*): Option[List[String]] =
try {
Some(new MyClass(new URL(arg(0)))
.map(x => x.getRawString.toString))
} catch {
case e: Exception => { e.printStackTrace(); None; }
}
или, возможно, вернуть само исключение:
def method1(arg: String*): Either[Exception,List[String]] =
try {
Right(new MyClass(new URL(arg(0)))
.map(x => x.getRawString.toString))
} catch {
case e: Exception => Left(e)
}
Поскольку этот шаблон релятивистски распространен, для этой цели есть специальный класс Scala Try
, который дает эти понятия значимым именам и добавляет много hel пылкие методы. Try[A]
инкапсулирует результат вычисления, который возвращает A
или исключение, если вычисление не удалось:
sealed abstract class Try[+T]
final case class Success[+T](value: T) extends Try[T]
final case class Failure[+T](exception: Throwable) extends Try[T]
так буквальное переписывание вашего метода будет
def method1(arg: String*): Try[List[String]] =
try {
Success(new MyClass(new URL(arg(0)))
.map(x => x.getRawString.toString))
} catch {
case e: Exception => Failure(e)
}
Но, конечно, Scala имеет методы для этого шаблон (в конце концов, это то, что Try
для), так что вы можете написать просто
def method1(arg: String*): Try[List[String]] =
Try { new MyClass(new URL(arg(0)))
.map(x => x.getRawString.toString)) }
(Существует небольшая разница erence, Try { ... }
также catches some Error
s).
Вы можете получить это на typecheck путем повторного исключения исключения, то есть 'e.printStackTrace(); throw e' или exiting, т. е. 'e.printStackTrace(); sys.exit', в зависимости от того, что вы хотите, - так как выбрасываемые исключения и sys.exit имеют тип 'Nothing', который подклассифицирует все. –