Скажем, я использую библиотеку Java из моего проекта Scala. Эта библиотека Java генерирует исключения по всему месту, но я не чувствую себя комфортно, просто позволяя им распространяться "в мире Scala", поскольку нет способа убедиться, какие исключения может использовать метод Scala (за исключением документирования их). Так что это код, который я обычно пишу:
def doesNotThrowExceptions(parameter: String): Either[Throwable, T] =
catching(classOf[IOException], classOf[NoSuchAlgorithmException]) either {
// Code calling the Java library
// Code generating a value of type T
}
Затем, как правило, я буду использовать Either.RightProjection.flatMap
для цепных методов, возвращающих Either[Throwable, ...]
или Either.RightProjection.map
, чтобы смешивать методы, возвращающие Either[Throwable, ...]
и другие методы. Или просто Either.fold
сделать что-то со значением Throwable
. Так или иначе, это все еще не кажется абсолютно правильным.
Это самый "идиоматический" способ справиться с исключениями Java в Scala? Разве нет лучшего способа?