Handling errors【翻译】


原文:Handling errors

处理错误

HTTP应用可以返回两类主要的错误类型——客户端错误和服务端错误。客户端错误是指连接的客户端触发了什么错误,服务端错误是指有什么错误发生在服务端。

在许多情况下Play会自动的发现客户端错误——这些错误包括如错误的报头值,不支持的内容类型,请求找不到的资源。在多数情况下,Play也会自动的处理服务端错误——如果你的Action代码抛出异常。Play将会捕捉这个并生成一个服务端错误网页发送给客户端。

Play处理这些错误的接口是 HttpErrorHandler。它定义了两个方法,onClientError, 和 onServerError.

增加自定义的错误处理

自定义的错误处理可以通过在根包下创建一个叫做ErrorHandler的类实现,这个类实现了 HttpErrorHandler,例如:

import play.api.http.HttpErrorHandler  
import play.api.mvc._  
import play.api.mvc.Results._  
import scala.concurrent._  
import javax.inject.Singleton;

@Singleton
class ErrorHandler extends HttpErrorHandler {

def onClientError(request: RequestHeader, statusCode: Int, message: String) = {  
Future.successful(  
Status(statusCode)("A client error occurred: " + message)  
)
}

def onServerError(request: RequestHeader, exception: Throwable) = {  
Future.successful(  
InternalServerError("A server error occurred: " + exception.getMessage)  
)
}
}

如果你不想把你的错误处理放到根包,或者如果你想可以为不同的环境配置不同的错误处理,那么你可以通过配置在配置资源文件application.conf中的 play.http.errorHandler:

play.http.errorHandler = "com.example.ErrorHandler"  

扩展默认的错误处理

Play的默认错误处理提供了许多有用的方法,做到了开箱即用。例如在开发模式下,当服务端错误发生时,Play将会尝试在你的应用中定位并提交一段引起异常的代码,因此,你可以快速的看到并识别问题。你也许想在产品中提供自定义的服务端错误,同时仍然保持开发中的功能。为了方便的做到这点,Play提供了一个 DefaultHttpErrorHandler 类,这个类有一些你可以覆盖的便利的方法,因此你可以在Play已有的行为中混入自己的逻辑。

例如,为了只在产品中提供自定义的服务端错误信息,去掉开发的错误信息不用,并且你还想提供一个指定的禁用错误的页面:

import javax.inject._

import play.api.http.DefaultHttpErrorHandler  
import play.api._  
import play.api.mvc._  
import play.api.mvc.Results._  
import play.api.routing.Router  
import scala.concurrent._

@Singleton
class ErrorHandler @Inject() (  
env: Environment,  
config: Configuration,  
sourceMapper: OptionalSourceMapper,  
router: Provider[Router]  
) extends DefaultHttpErrorHandler(env, config, sourceMapper, router) {

override def onProdServerError(request: RequestHeader, exception: UsefulException) = {  
Future.successful(  
InternalServerError("A server error occurred: " + exception.getMessage)  
)
}

override def onForbidden(request: RequestHeader, message: String) = {  
Future.successful(  
Forbidden("You're not allowed to access this resource.")  
)
}
}

检查DefaultHttpErrorHandler 的完成API文档,看看那个方法可以被覆盖,还有如何很好的利用它们。

祝青

继续阅读此作者的更多文章