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は実際のメソッドよりも大きく、すべてのメソッドに対してこれを行う必要があります。クラスは一見、trycatchの醜いコレクションになります。見栄えが悪く、気が散るようなコード全体のキャッチを回避または最小化する方法はありますか?私はScala(およびJava BTW)を初めて使用するので、何かが足りないと思います。

DBオブジェクトにJSONを送信させたくないので、db.get_collectionメソッドでtrycatchを使用することはできません。

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 に答える