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 ...
随机推荐
- 「插头dp」
Tasklist: 标识设计 神奇游乐园 Manhattan Wiring ParkII 游览计划 CITY: 只用一条回路经过所有可通过的块 括号匹配,注意结束位置不一定是(n,m) 地板: 分已经 ...
- 第08组 Alpha冲刺(2/6)
队名:955 组长博客: 作业博客:https://edu.cnblogs.com/campus/fzu/SE_FZU_1917_K/homework/9939 组员情况 组员1(组长):庄锡荣 过去 ...
- DT包 -- R语言中自定义表格数据
DT 包提供了 JavaScript 库 DataTables 的一个R接口,它使得R对象(矩阵或数据框)可以在HTML页面上显示为表格. 该包的DataTables函数生成的表格提供了数据的筛选.分 ...
- 划水嘶吼misc
划水嘶吼misc [题目描述]: 开局一张图,flag全靠编 [题目writeup]: 瞅半天,瞅到二维码 然后用potplayer按帧查找到skr二维码 通过PS自动调整对比度,扫出key1,2,3 ...
- 运行时异常RuntimeException捕获的小测试
public class ExceptionTest { public static void main(String[] args) throws InterruptedException { ne ...
- docker run 中的privileged参数
docker 应用容器 获取宿主机root权限(特殊权限-) docker run -d --name="centos7" --privileged=true centos:7 / ...
- 修改Jupyter Notebook默认文件存储路径(已安装Anaconda)
https://blog.csdn.net/weixin_44799144/article/details/91823079 修改Jupyter Notebook默认文件存储路径首先,安装好Anaco ...
- JVM线程状态Running、Sleeping、Wait、Park、Monitor
1,使用JVisualVM时,打开Threads监控,我们可以发现Java的线程状态有以下几种: 2,JVM线程状态: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_W ...
- sql为什么要用where 1=1?
这个1=1常用于应用程序根据用户选择项的不同拼凑where条件时用的.例如:查询用户的信息,where默认为1=1,这样用户即使不选择任何条件,sql查询也不会出错.如果用户选择了姓名,那么where ...
- tp使用ajaxReturn返回二维数组格式的字符串,前台如何获取非乱码
参考: https://www.cnblogs.com/jiqing9006/p/5000849.html https://blog.csdn.net/zengxiangxuan123456/arti ...