课程名称:GO开发工程师
课程章节:3-1:defer的调用;3-2:错误处理概念;2-3/4:服务器统一错误处理
课程讲师: ccmouse
课程内容:
defer:
- 作用:确保在函数结束时调用
- 执行顺序:多个defer遵循栈规则, 先进后出
- 什么时候使用:defer: open/close;lock/unlock;PrintHeader/PrintFooter
defer代码示例
func tryDefer() {
defer fmt.Println(1)
defer fmt.Println(2)
// 即使中间 return 或者 panic 都不会影响defer的输出
fmt.Println(3) // 3, 2, 1
}
错误处理代码示例
func writeFile(filename string) {
// os.O_EXCL: used with O_CREATE, file must not exist.
// 0666: 文件权限,可读可写
file, err := os.OpenFile(filename, os.O_EXCL|os.O_CREATE, 0666)
//err = errors.New("custom err"); // 模拟非 *os.PathError类型 的错误
if err != nil {
if pathError, ok := err.(*os.PathError); !ok {
fmt.Println("unknown error", err)
} else {
fmt.Println(pathError.Op)
fmt.Println(pathError.Path)
fmt.Println(pathError.Error())
}
return
}
defer file.Close() // open、close匹配
writer := bufio.NewWriter(file) // 先写入内存,再将内存中的buffer写入文件(加快写入速度)
defer writer.Flush()
f := fib.Fibonacci()
for i := 0; i < 20; i++ {
fmt.Fprintln(writer, f())
}
}
统一错误处理函数代码示例:
type appHandler func(writer http.ResponseWriter, request *http.Request) error
// 统一错误处理,http响应函数
func errWrapper(handler appHandler) func(http.ResponseWriter, *http.Request) {
return func(writer http.ResponseWriter, request *http.Request) {
err := handler(writer, request)
if err != nil {
code := http.StatusOK
switch {
case os.IsNotExist(err):
code = http.StatusNotFound
default:
code = http.StatusInternalServerError
}
http.Error(writer, http.StatusText(code), code)
}
}
}
课程收获:
- defer的使用可以避免打开文件后忘记进行关闭操作等需要手动处理的操作
- 写文件时可以先写入内存,再将内存中的buffer写入文件以加快文件写入速度,避免频繁落盘操作。
- 实际项目开发过程中需要多各种可能出现的错误进行异常处理。
- 提取统一错误处理方式,业务处理函数不用管错误,直接抛出错误。
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦