Как поймать все ошибки в любом действии скаляры?

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

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

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

   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, поэтому наличие try catch в методе db.get_collection не является вариантом.

Ответ 1

Ну, я не знаю 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
}

Ответ 2

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

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

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