2014-08-28 86 views
4

我正在使用播放框架开发REST API。我想为我的所有操作实施集中的错误处理。播放框架中的错误处理

达到此目的的最佳方法是什么?

+0

你看过Scala Future和Play之前的行动/结果吗? – cchantep 2014-08-28 11:46:10

+0

@applicius:我不太清楚你的评论如何解释正确的地方执行*集中*在播放应用程序中的错误处理... – jfu 2014-08-28 11:56:15

+0

我很不确定你有没有阅读Play框架文档关于行动,动作组合,行动构建和使用未来。 – cchantep 2014-08-28 12:01:24

回答

5

你应该看看GlobalSettingshttps://www.playframework.com/documentation/2.3.x/ScalaGlobal

尤其是,它可以让你覆盖:

def onError(request: RequestHeader, ex: Throwable) 
def onHandlerNotFound(request: RequestHeader) 
def onBadRequest(request: RequestHeader, error: String) 

onError可能是你正在寻找的一个,但其他人可能是太有用:)

5

的另一种方式做,这是使用filter,如:

object ExceptionFilter extends EssentialFilter { 
    def apply(nextFilter: EssentialAction) = new EssentialAction { 
    def apply(requestHeader: RequestHeader) = { 
     val next: Iteratee[Array[Byte], Result] = nextFilter(requestHeader) 

     // Say your backend throws an ItemNotFound exception. 
     next recoverWith { 
     case e: ItemNotFound => Iteratee.ignore[Array[Byte]] 
      .map(_ => Results.NotFound("Item not in the database!")) 
     } 
    } 
    } 
} 

然后钩住了在全局设置:

object Global extends WithFilters(CSRFFilter(), ExceptionFilter) with GlobalSettings 

这可能允许在需要时您做一些与请求主体。我同意在大多数情况下使用GlobalSettings.onError可能是最简单的方法。