对 dotweb 框架进行统一的自定义错误处理
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 框架进行统一的自定义错误处理的更多相关文章
- Flask框架 之abort、自定义错误、视图函数返回值与jsonify
一.abort函数 使用abort函数可以立即终止视图函数的执行,并可以返回给前端特定的值. abort函数的作用: 1.传递状态码,必须是标准的http状态码 2.传递响应体信息 @app.rout ...
- Gin框架 - 自定义错误处理
目录 概述 错误处理 自定义错误处理 panic 和 recover 推荐阅读 概述 很多读者在后台向我要 Gin 框架实战系列的 Demo 源码,在这里再说明一下,源码我都更新到 GitHub 上, ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- C#不用union,而是有更好的方式实现 .net自定义错误页面实现 .net自定义错误页面实现升级篇 .net捕捉全局未处理异常的3种方式 一款很不错的FLASH时种插件 关于c#中委托使用小结 WEB网站常见受攻击方式及解决办法 判断URL是否存在 提升高并发量服务器性能解决思路
C#不用union,而是有更好的方式实现 用过C/C++的人都知道有个union,特别好用,似乎char数组到short,int,float等的转换无所不能,也确实是能,并且用起来十分方便.那C# ...
- ASP.NET全局错误处理和异常日志记录以及IIS配置自定义错误页面
应用场景和使用目的 很多时候,我们在访问页面的时候,由于程序异常.系统崩溃会导致出现黄页.在通常的情况下,黄页对于我们来说,帮助是极大的,因为它可以帮助我们知道问题根源,甚至是哪一行代码出现了错误.但 ...
- MVC4 自定义错误页面(转)
一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...
- jquery.validate使用 - 自定义错误信息
自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...
- ASP.NETMVC自定义错误页面真的简单吗?
Note:文章前半部分翻译自 http://benfoster.io/blog/aspnet-mvc-custom-error-pages ,着急的可直接看总结~ 如果你在设置asp.net mvc自 ...
- MVC4 自定义错误页面(三)
一.概述 MVC4框架自带了定义错误页,该页面位于Shared/Error,该页面能够显示系统未能捕获的异常,如何才能使用该页面: 二.使用步骤: 1.配置WebConfig文件,在System.We ...
随机推荐
- 用 parseInt()解决的 小 bug
在做轮播模块的时候遇到问题是:你在 连续指示小按钮 时候再去 只有 点击 下一张按钮,出现bug: 指示小按钮的 className 当前显示的 calssName 为 undefined ! // ...
- javascript中json对象json数组json字符串互转及取值
今天用到了json数组和json对象和json类型字符串之间互转及取值,记录一下: 1.json类型的字符串转换为json对象及取值 var jsonString = '{"bar" ...
- 想询问一个职业规划的问题,前端开发 or nodejs?
先说说个人情况,目前个人定位于初中级前端吧,工作近两年,目前前端开发和nodejs都有一定的了解,水平感觉可以搭一些小型的网站.作为前端开发,目前掌握的技术是javascript,平时更多的是用jqu ...
- Java数据类型及运算
(一),Java基本类型及运算 注释:可以用于生成API: 命令如:javadoc -d apidoc windowtitle hhh -doctitle aaa -header bbbb -ver ...
- vue实现全选效果
vue实现全选效果 接触vue快半年了,记得刚用vue做项目的时候遇到一个全选功能,当时到处百度也没有找到怎么实现,最后还是用了jquery进行dom操作实现的. 今天没事就顺手写了一个,感觉很简单, ...
- pdo操纵mysql数据库
PDO是mysql数据库操作的一个公用类了,我们不需要进行自定类就可以直接使用pdo来操作数据库了,但是在php默认配置中pdo是未开启所以我们必须先在php.ini中开启它才可以使用,下文我会讲到. ...
- 作死上CODEVS,青铜题
题面:输入一列整数,输出它们的总和.最大值.最小值.并从大到小输出. 先上一波伪代码,认真地做一波数组排序题. #include<stdio.h> #include<math.h&g ...
- 在Angular项目下使用Umeditor
Umeditor是百度旗下的开源富文本编辑器项目,目前用于百度贴吧,是ueditor的迷你版本. 公司的Angular后台管理项目需要上传一些新闻,用Umeditor十分适合.但是目前官方只提供Jsp ...
- Collection的迭代器Iterator
Collection -- 迭代的方法 toArray() iterator() 迭代器的作用:抓取集合中的元素 迭代器的方法有 hasNext() next() remove() public ...
- java中构造方法和this,static关键字
构造方法: 构造方法是一种特殊的方法,用于创建该类的对象,对对象的数据进行初始化 格式如下: [修饰符] 类名(形参列表){ 方法体 } 特点 A:方法名和类名相同 B:没有返回值类型,连void都 ...