如何捕捉任何Scalatra动作中的所有错误?

问题描述:

我使用了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方法上尝试捕获不是一个选项。

好了,我不知道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

有一种特殊的路由处理程序是:

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

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

+0

这是在Scalatra中处理错误的惯用方法,虽然它在文档中缺失。 – afternoon 2013-03-14 16:17:13

+3

这应该是被接受的答案。 – 2015-09-10 20:44:30