如何捕获任何scalatra动作中的所有错误?

时间:2012-02-28 11:35:35

标签: scala scalatra

我使用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集合。 有什么方法可以避免或最小化整个代码中的不良外观和分散注意力的尝试捕获?我是Scala(和Java BTW)的新手,所以我想我错过了一些东西。

我不希望DB对象发送JSON,因此在db.get_collection方法上使用try catch不是一种选择。

2 个答案:

答案 0 :(得分:41)

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

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

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

答案 1 :(得分: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
}