golang近几年越来越火,尤其今年,我是一个不甘被抛弃的程序猿,因此在日常工作中,也开始使用go语言,Web框架主要使用dotweb框架,按照github上描述的主要特性如下:

Features

  • 支持静态路由、参数路由、组路由
  • 路由支持文件/目录服务,支持设置是否允许目录浏览
  • 中间件支持,支持App、Group、Router级别的设置
  • Feature支持,可绑定HttpServer全局启用
  • 支持STRING/JSON/JSONP/HTML格式输出
  • 统一的HTTP错误处理
  • 统一的日志处理
  • 支持Hijack与websocket
  • 内建Cache支持
  • 支持接入第三方模板引擎(需实现dotweb.Renderer接口)
  • 模块可配置化,85%模块可通过配置维护

今天我主要想说说最后一个特性里提到的,“统一的 HTTP 错误处理”。

那么,在dotweb里如何优雅的处理呢?

我们先看下dotweb程序发生异常的时候,默认情况下,看会发生什么?

package main

import (
"fmt"
"github.com/devfeel/dotweb"
"strconv"
) func main() {
//初始化DotServer
app := dotweb.New() //开启development模式
app.SetDevelopmentMode() //设置路由
InitRoute(app.HttpServer) // 开始服务
port :=
fmt.Println("dotweb.StartServer => " + strconv.Itoa(port))
err := app.StartServer(port)
fmt.Println("dotweb.StartServer error => ", err)
} func DefaultError(ctx dotweb.Context) error {
panic("my panic error!")
} func InitRoute(server *dotweb.HttpServer) {
server.Router().GET("/error", DefaultError)
}

看看,访问会发生什么?

ok。确实输出了我们的异常信息,不过下面跟着这么一大堆调用堆栈,明显是不能给用户看到的,参考其他Web容器,一般会返回用户一段:Internal Server Error

这里可以通过将代码里的app.SetDevelopmentMode() 改为 app.SetProductionMode(),我们再看下访问结果:

ok,满足我们的要求了。

看到这里,大家是否觉得缺了点什么,就只能这么两种方式么?很明显,不是的:)

我们总是希望一个框架能给我们足够的灵活性,足够的定制空间,顺着这个思路,我们来分析下。

我们先看下dotweb的最核心的结构体定义:

DotWeb struct {
HttpServer *HttpServer
cache cache.Cache
OfflineServer servers.Server
Config *config.Config
Modules []*HttpModule
Middlewares []Middleware
ExceptionHandler ExceptionHandle
NotFoundHandler NotFoundHandle
AppContext *core.ItemContext
middlewareMap map[string]MiddlewareFunc
middlewareMutex *sync.RWMutex
}

果然,其中有一项:ExceptionHandler,进一步看下这个怎么定义的:

ExceptionHandle func(Context, error)

额,很简单有没有?果然很简单那!二话不说,我们赶紧来测试下。

先做个简单测试,比如程序发生错误时,我们向用户输出一个 error 字符串,我们来看下怎么做:

package main

import (
"fmt"
"github.com/devfeel/dotweb"
"strconv"
) func main() {
//初始化DotServer
app := dotweb.New() //设置路由
InitRoute(app.HttpServer) //设置自定义异常处理接口
app.SetExceptionHandle(func(ctx dotweb.Context, err error) {
ctx.WriteString("oh, 我居然出错了! ", err.Error())
}) // 开始服务
port :=
fmt.Println("dotweb.StartServer => " + strconv.Itoa(port))
err := app.StartServer(port)
fmt.Println("dotweb.StartServer error => ", err)
} func DefaultError(ctx dotweb.Context) error {
panic("my panic error!")
} func InitRoute(server *dotweb.HttpServer) {
server.Router().GET("/error", DefaultError)
}

访问下,会看到什么?

一切顺利,输出了我们希望看到的内容。

看到这里,大家是否有一个直观的印象?dotweb中,对于应用未处理的异常,只要通过设置SetExceptionHandle自定义处理函数,就可以对异常做你想做的任何事:)

欢迎大家关注dotweb,一个成长中的go web框架。希望大家多给建议!

github地址:https://github.com/devfeel/dotweb

QQ群:193409346

对 dotweb 框架进行统一的自定义错误处理的更多相关文章

  1. Flask框架 之abort、自定义错误、视图函数返回值与jsonify

    一.abort函数 使用abort函数可以立即终止视图函数的执行,并可以返回给前端特定的值. abort函数的作用: 1.传递状态码,必须是标准的http状态码 2.传递响应体信息 @app.rout ...

  2. Gin框架 - 自定义错误处理

    目录 概述 错误处理 自定义错误处理 panic 和 recover 推荐阅读 概述 很多读者在后台向我要 Gin 框架实战系列的 Demo 源码,在这里再说明一下,源码我都更新到 GitHub 上, ...

  3. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  4. C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路

    C#不用union,而是有更好的方式实现   用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...

  5. ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面

    应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...

  6. MVC4 自定义错误页面(转)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

  7. jquery.validate使用 - 自定义错误信息

    自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...

  8. ASP.NETMVC自定义错误页面真的简单吗?

    Note:文章前半部分翻译自 http://benfoster.io/blog/aspnet-mvc-custom-error-pages ,着急的可直接看总结~ 如果你在设置asp.net mvc自 ...

  9. MVC4 自定义错误页面(三)

    一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...

随机推荐

  1. 用 parseInt()解决的 小 bug

    在做轮播模块的时候遇到问题是:你在 连续指示小按钮 时候再去 只有 点击 下一张按钮,出现bug: 指示小按钮的 className 当前显示的 calssName 为 undefined ! // ...

  2. JS前端数据格式化

    当我们从后台取了数据,但是我们希望在前台统一显示格式时,我们可能需要格式化数据. 今天正好总结一下前端JS格式化数据的几个方法: 1. toFixed() 方法   可把 Number 四舍五入为指定 ...

  3. extj6.0写增删查改(1)-------查询

    本文主要实现的效果是:点击查询按钮,根据form中的条件,在Grid中显示对应的数据(如果form为空,显示全部数据) 一.静态页面 1.查询按钮 { text:'查询', handler: 'onS ...

  4. MongoDB基础教程系列--第九篇 MongoDB 分片

    1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 Mongo ...

  5. 超炫的 CSS3 页面切换动画效果

    在线演示      源码下载

  6. Apache Spark1.1.0部署与开发环境搭建

    Spark是Apache公司推出的一种基于Hadoop Distributed File System(HDFS)的并行计算架构.与MapReduce不同,Spark并不局限于编写map和reduce ...

  7. 在国内使用maven下载jar包非常慢的解决方法

    在国内使用maven下载jar包非常慢的解决方法 1.原因: 很多jar包在国外环境,所以会很慢. 2.解决方法 maven支持镜像环境下载,所以首先找到maven的conf目录中的settings. ...

  8. FrameBuffer系列 之 相关结构与结构体

    在linux中,fb设备驱动的源码主要在Fb.h (linux2.6.28\include\linux)和Fbmem.c(linux2.6.28\drivers\video)两个文件中,它们是fb设备 ...

  9. ASP.Net零碎

    ASP.Net零碎 ServerPush 什么是ServerPush,服务器向客户端浏览器“推送”,其实就是“长连接”. 只有浏览器请求服务器端,服务器端才有给浏览器响应数据,不会主动向浏览器推送数据 ...

  10. JS的Dom树小结

    一[DOM树节点]  DOM节点分为三大类:元素节点.文本节点.属性节点 文本节点.属性节点,为元素节点的两个子节点:  通过getElement系列方法,可以去到元素节点.     二[查看节点] ...