侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130555 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

【二 HTTP编程】8. 错误处理

2023-09-21 星期四 / 0 评论 / 0 点赞 / 21 阅读 / 3255 字

HTTP返回的错误类型可以主要的划分为客户端错误和服务器错误。 Play会自动发现客户端错误,如:错误的 Header 值,不支持的content type,请求了不存在的资源等。同样Play也会自动

HTTP返回的错误类型可以主要的划分为客户端错误和服务器错误。

Play会自动发现客户端错误,如:错误的 Header 值,不支持的content type,请求了不存在的资源等。同样Play也会自动处理服务端错误,如果你的Action抛出了一个异常,Play将自动捕获它并返回一个错误页面。

Play用于处理这些错误的接口是 HttpErrorHandler。它定义了onClientError及onServerError方法。

自定义error handler

如果你使用 BuiltInComponents 来构建app,可以重写httpErrorHandler方法来返回自定义hander的实例。

如果使用依赖注入(如:Guice),error handler可以在运行时载入。最简单的方式是在根目录下创建ErrorHandler来实现HttpErrorHandler接口,如下所示:

import play.api.http.HttpErrorHandlerimport play.api.mvc._import play.api.mvc.Results._import scala.concurrent._import javax.inject.Singleton@Singletonclass 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)    )  }}

如果不想把它放在root package下,或者希望在不同环境时使用不同的error handler,你可以在applicatio.conf中配置play.http.errorHandler:

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

继承默认的Error Handler

Play的默认error handler已经提供了一系列的实用功能。例如在dev模式下,当发生server error时,Play会尝试自动定位错误,并插入一段代码来描述引发异常的原因来让你直观的看到错误。你可能希望在生产环境下提供自定义的错误提示。Play内置了DefaultHttpErrorHanlder来提供一些简便的方法,让开发者可以通过简单的继承重写来为Play增加新的功能。

例如可以这样在生产环境中提供一个自定义的forbidden error page来隐藏开发的错误消息:

import javax.inject._import play.api.http.DefaultHttpErrorHandlerimport play.api._import play.api.mvc._import play.api.mvc.Results._import play.api.routing.Routerimport scala.concurrent._@Singletonclass 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中可以重写的功能。

广告 广告

评论区