Я работаю над приложением с Scala. Я пытаюсь реализовать обработку исключений в приложении. Я пытался использовать Either
для обработки исключений. Для простых случаев, похоже, достаточно обработать исключения. Однако, когда мне нужно получать результаты из нескольких таблиц с помощью объединений, обработка исключений создает больше проблем, чем решение. Ниже описана моя структура приложения:Обработка исключений в scala
Использование шаблона репозитория для операций с базой данных, который определяет все операции взаимодействия с базой данных. Для, например, у меня есть центральный репозиторий, который определяет findAll
, findById
, insert
, delete
, update
, exists
и т.д. Мой findAll
методы подпись была изменена на Either[CustomException, List[TEntity]]
, аналогично findById
типа методов является Either[CustomException, Option[TEntity]]
.
Теперь предположит, что, если мне нужно забрать сотрудник из базы данных в моем методе, я буду делать что-то, как показано ниже:
def getVehicleById(id:Long) = {
val vehicle = repository.findById(id)
//i have one-to-one mapping with Employee table for the driver of the vehicle
val driver = empRepository.findById(vehicle.driverId)
}
Теперь типа транспортного средства будет Either[CustomException, Option[Vehicle]]
и тип водителя Either[CustomException, Employee]
Если мне нужно сделать больше операций после получения результатов, я должен использовать случай Right/Left, а затем сделать это. Проблема в том, что может быть внутри правильного случая, мне может потребоваться присоединиться к другой таблице, что приведет к ее результату снова Either[CustomException, Entity]
. если в этой операции возникла какая-либо ошибка, мне нужно снова использовать блок catch try. Я чувствую, что этот вид hanling становится очень трудным для управления, когда сложность кода возрастает, а также у меня будет много кодовых табличек кодов для обработки этих ситуаций, что противоречит самому принципу Scala.
Так что мой вопрос в том, как я могу лучше справляться с исключениями без большого кода котельной плиты.
Примечание: Я исхожу из фона Java, работаю на Scala только пару месяцев.
EDIT
Добавление образца кода с Try: Этот пример очень близок к требованию у меня есть.
import scala.util._
def checkTry:Try[List[Int]] = Success(List(2))
def checkTryStr:Try[String] = Success("Asd")
def getVehicleWithDriver = for {
a <- checkTry
c <- a
b <- checkTryStr
}yield {
(c,b)
}
getVehicleWithDriver
Но с кодом bove, я получаю ошибки компиляции.
Error:(9, 6) type mismatch; found : scala.util.Try[(Int, String)] required: scala.collection.GenTraversableOnce[?] b <- checkTryStr ^ Error:(9, 6) type mismatch; found : scala.util.Try[(Int, String)] required: scala.collection.GenTraversableOnce[?] b <- checkTryStr ^ Error:(8, 6) type mismatch; found : List[Nothing] required: scala.util.Try[?] c <- a ^
Я не вижу имя 'Try' в вашем вопросе, так что вы можете знать об этом: http://www.scala-lang.org/files/archive/nightly/docs/ library/index.html # scala.util.Try –
Извините, я забыл упомянуть об этом. Но не то же самое с попыткой. Вместо сопоставления с правым/левым, мне нужно сопоставить с Try и wouldnt, которые также создают очень большие вложенные заявления try? –
Как насчет альтернативных методов сканирования? http://typelevel.org/blog/2014/02/21/error-handling.html –