2012-02-28 56 views
11

我使用了Scalatra「出口」一個MongoDB的數據到JSON,我的行爲是非常簡單的,如:如何捕捉任何Scalatra動作中的所有錯誤?

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) 
    } 
    } 

的嘗試捕捉較大,實際的方法,我需要爲每一個方法,類成爲一見鍾情嘗試捕捉的一個醜陋的收集做到這一點。 有什麼辦法可以避免或最大限度地減少糟糕的外觀和分心嘗試抓住所有的代碼?我是新來的斯卡拉(和Java順便說一句)所以我想我失去了一些東西。

我不想讓數據庫對象發送JSON,因此在db.get_collection方法上嘗試捕獲不是一個選項。

回答

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

我最後的解決辦法是: 'VAL ErrorHandling中:PartialFunction [Throwable的,單位] = {' 如果我使用的ErrorHandler,我得到了這個名字的錯誤必須重寫。 它似乎也需要java.lang.Throwable,而不是Exception – user1216071 2012-02-29 04:04:12

+0

@ user1216071好的,我相應地修復了代碼,所以其他人不必弄清楚(如果他們碰巧錯過了你的評論)。 – 2012-02-29 15:59:51

37

有一種特殊的路由處理程序是:

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

通過更改case語句,您可以打開錯誤類型。

+0

這是在Scalatra中處理錯誤的慣用方法,雖然它在文檔中缺失。 – afternoon 2013-03-14 16:17:13

+3

這應該是被接受的答案。 – 2015-09-10 20:44:30