13

我正在使用 scalatra 将 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 catch 比实际方法更大,我需要为每个方法都这样做,乍一看,这个类变成了一个丑陋的 try catch 集合。有什么方法可以避免或最小化整个代码中难看和分散注意力的 try catch 吗?我是 Scala(和 Java BTW)的新手,所以我想我错过了一些东西。

我不希望 DB 对象发送 JSON,因此不能在 db.get_collection 方法上尝试捕获。

4

2 回答 2

45

为此有一个特殊的路由处理程序:

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

通过更改case语句,您可以打开错误类型。

于 2013-02-06T15:13:57.140 回答
6

好吧,我不太了解 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
}
于 2012-02-28T14:56:04.700 回答