Как поймать все ошибки в любом действии скаляры?
Я использую 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
, вы можете включить тип ошибки.