2012-02-28 11 views
11

私は次のように私の行動は、非常に単純です、JSONに「輸出」MongoDBのデータをにscalatraを使用しています:私は何かが間違って行けば、他の側で、HTTPエラーやテキストを送信したいどのようにスカラのアクションですべてのエラーをキャッチする?

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

ユーザーにとって意味のあるものに変換されます。 だから、方法は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キャッチを避けるか最小限にする方法はありますか?私はスカラ(とJavaのBTW)に慣れていないので、何かが足りないと思う。

DBオブジェクトにJSONを送信しないようにするため、db.get_collectionメソッドでtryキャッチを行うことはオプションではありません。あなたはこのような何かを行うことができるように

答えて

5

まあ、私は十分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 
} 
+0

私の最終的な解決策だった: 'ヴァルerrorHandling:私はのErrorHandlerを使用する場合は部分写像[Throwableの、単位] = {' は、私はオーバーライドする必要がありますし、その名前についてのエラーを得ました。 例外の代わりにjava.lang.Throwableが必要なようにも見えました – user1216071

+0

@ user1216071それに応じてコードを修正しました。 –

37

このための特別なルートハンドラあります:

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

caseステートメントを変更することで、エラータイプをオンにすることができます。

+0

Scalatraのエラーを処理するための慣用的な方法ですが、ドキュメントには記載されていません。 – afternoon

+3

これは受け入れられる回答である必要があります。 –

関連する問題