Go基础编程实践(五)—— 错误和日志
自定义错误类型
Go中可以使用errors.New()创建错误信息,也可以通过创建自定义错误类型来满足需求。error是一个接口类型,所有实现该接口的类型都可以当作一个错误类型。
// error类型定义
type error interface {
// Error方法给出了错误描述
Error() string
}
package main
import "fmt"
// 创建一个表示错误的结构体类型,错误类型命名约定以Error结尾
type myError struct {
shortMessage string
detailedMessage string
}
// 实现error接口
// 引用传递以得到更好的内存管理
func (e *myError) Error() string {
return e.shortMessage + "\n" + e.detailedMessage
}
func doSomething() error {
return &myError{shortMessage:"Wohoo something happened!", detailedMessage:"File cannot found!"}
}
func main() {
err := doSomething()
// fmt.Println在打印错误时会在内部调用Error()方法,得到错误描述
fmt.Println(err)
}
记录日志
package main
import (
"fmt"
"log"
"os"
)
func main() {
logFile, err := os.Create("logfile")
if err != nil {
fmt.Println("An error occured...")
}
defer logFile.Close()
// SetOutput设置标准logger的输出位置
log.SetOutput(logFile)
log.Println("Doing some logging here...")
// Fatalln等价于调用Println后调用os.Exit(1).
log.Fatalln("Fatal: Application crashed!")
}
捕获异常
package main
import "fmt"
func main() {
sayHello()
fmt.Println("After the panic was recovered!")
}
func sayHello() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered in f", r)
}
}()
writeSomething()
}
func writeSomething() {
panic("Write operation error")
}
Go基础编程实践(五)—— 错误和日志的更多相关文章
- 并发编程实践五:ReentrantLock
ReentrantLock是一个可重入的相互排斥锁,实现了接口Lock,和synchronized相比,它们提供了同样的功能.但ReentrantLock使用更灵活.功能更强大,也更复杂.这篇文章将为 ...
- Go基础编程实践(六)—— 文件
检查文件是否存在 在此程序同目录下创建log.txt文件,以检测. package main import ( "os" "fmt" ) func main() ...
- Go基础编程实践(十)—— 数据库
从数据库中读取数据 在http://sqlitebrowser.org/下载sqlite3可视化工具,在本main.go同目录下创建personal.db数据库,创建表如下: package main ...
- Go基础编程实践(九)—— 网络编程
下载网页 package main import ( "io/ioutil" "net/http" "fmt" ) func main() ...
- Go基础编程实践(八)—— 系统编程
捕捉信号 // 运行此程序,控制台将打印"Waiting for signal" // 按Ctrl + C 发送信号以关闭程序,将发生中断 // 随后控制台依次打印"Si ...
- Go基础编程实践(七)—— 并发
同时运行多个函数 观察常规代码和并发代码的输出顺序. // 常规代码,顺序执行,依次输出 package main import ( "fmt" "time" ...
- Go基础编程实践(四)—— 数组和map
数组去重 package main import "fmt" func main(){ intSlice := []int{1,5,5,5,5,7,8,6,6, 6} fmt.Pr ...
- Go基础编程实践(三)—— 日期和时间
日期和时间 package main import ( "fmt" "time" ) func main() { // 获取当前时间 current := ti ...
- Go基础编程实践(二)—— 类型转换
bool to string strconv包的FormatBool函数用于将bool转为string package main import ( "fmt" "strc ...
随机推荐
- thymeleaf做if判定
<div class="showing"> <h2>条件判断</h2> <p th:if="${testBoolean}&quo ...
- Vuejs指令
一.内置指令 ①v-text:和 {{}} 一样,唯一的区别是,{{}} 会造成闪烁问题,而 v-text 不会有闪烁问题 <div id="app"> <h1 ...
- VUE 基础配置
原文:https://www.cnblogs.com/LearningOnline/p/9368838.html 1.安装Node.js等软件 报错: 解决: 原文:https://pdf-lib.o ...
- A#G/C013
A#G/C013 A Sorted Arrays 不会/kk B Hamiltonish Path 我是傻逼 如果一条路径不合法,那么把不合法的端点向没出现过的相邻点连过去救星了 C Ants on ...
- shell 小数比较大小
a=1.6b=6.1c=`echo "$a > $b" | bc`然後,如果 $c 是 1 ,那就成立,否則不成立. 参考: http://ju.outofmemory.cn ...
- Navicat自动断开连接处理方式
问题描述 使用Navicat连接mysql后,如果一段时间不操作,那么会再次操作时会提示无响应,每次都这样确实折磨人,大大降低了工作效率! 问题解决 关闭连接→右键连接→连接属性 将上述心跳时间设置为 ...
- 【Beta】Scrum meeting 3
目录 写在前面 进度情况 任务进度表 Beta-1阶段燃尽图 遇到的困难 照片 commit记录截图 小程序前端仓库 技术博客 写在前面 例会时间:5.7 22:30-23:00 例会地点:微信群语音 ...
- qt5 qmake开发
mkdir hello helloworld.cpp #include <QPushButton> #include <QApplication> int main(int a ...
- Shell命令行提示定制
/******************************************************************************* * Shell命令行提示定制 * 说明 ...
- mysql 添加时间自动添加更新时间自动更新
在数据库使用中经常使用到时间字段.常用的有创建时间和更新时间.然而在使用中想要创建时间在创建的时候自动设置为当前时间,更新时间在更新时自动更新为当前时间. 创建表 stu CREATE TABLE ` ...