как отловить все ошибки в любом действии скалатры? - PullRequest
12 голосов
/ 28 февраля 2012

Я использую скалатру для «экспорта» данных MongoDB в JSon, мои действия очень просты, например:

   get("/") {
      val title = db.get_collection("main", "api", "title")
      send_json(title)
    }

Я хочу отправить ошибку HTTP и текст, если что-то пойдет не так, нас другой стороны, он будет преобразован во что-то значимое для пользователя.Таким образом, метод стал следующим:

   get("/") {
     try {
      val title = db.get_collection("main", "api", "title")
      send_json(title)
     } catch {
      case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError)
      case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError)
      case e => send_error("Internal Error", InternalError)
    }
  }

Улов try больше, чем у фактического метода, и мне нужно сделать это для каждого метода, класс на первый взгляд становится уродливой коллекцией try catch.Есть какой-нибудь способ избежать или минимизировать плохо выглядящую и отвлекающую попытку поймать весь код?Я новичок в Scala (и Java BTW), поэтому я предполагаю, что что-то упустил.

Я не хочу, чтобы объект DB отправлял JSON, поэтому использование метода catch в методе db.get_collection не является опцией.

Ответы [ 2 ]

41 голосов
/ 06 февраля 2013

Для этого есть специальный обработчик маршрута:

error {
  case e: Throwable => {
    redirect("/")
  }
}

Изменяя оператор case, вы можете включить тип ошибки.

6 голосов
/ 28 февраля 2012

Ну, я недостаточно знаю Scalatra, но блок catch является частичной функцией, поэтому вы можете сделать что-то вроде этого:

val errorHandling: PartialFunction[Throwable, Unit] = {
  case e:java.util.NoSuchElementException => send_error("DB malformed", InternalError)
  case e:com.mongodb.MongoException => send_error("Can not connect to MongoDB", InternalError)
  case e => send_error("Internal Error", InternalError)
}

get("/") {
  try {
   val title = db.get_collection("main", "api", "title")
   send_json(title)
  } catch errorHandling
}
...