当前位置: 首页 > news >正文

Go的异常处理+文件处理

异常处理

package mainimport ("fmt""os"
)/*
go语言中尽量避免抛出异常
一般发生异常错误,都期望程序员自己处理
在函数的实现过程中,出现了不能处理的错误,可以返回给调用者处理
*/func main() {_, err := os.OpenFile("test.txt", os.O_RDONLY, 777)if err != nil {fmt.Println("打开文件失败")}
}

自定义错误

//自己产生错误类型
//内置类型  error
//产生错误的内置包   errorsfunc main() {if e := hello(""); e != nil {fmt.Println(e)}// hello("zhuhongye")
}func hello(name string) error {if len(name) == 0 {return errors.New("NameError: name is empty!!!!!")}fmt.Println("hello,", name)return nil
}

未知错误

package mainimport ("errors""fmt"
)/*
自定义的error  往往都是能够预知的
不能预知的       go--  panic  --程序终止了
*/
func main() {num := getelem(3)fmt.Println(num)
}// 未预料错误
func getelem(index int) int {arr := [3]int{10, 20, 30}return arr[index]
}

尽量避免panic

package mainimport ("errors""fmt"
)func main() {if num, e := getelem(3); e != nil {fmt.Println(e)} else {fmt.Println(num)}
}func hello(name string) error {if len(name) == 0 {return errors.New("NameError: name is empty!!!!!")}fmt.Println("hello,", name)return nil
}// 未预料错误
func getelem(index int) (int, error) {arr := [3]int{10, 20, 30}//return arr[index]//尽量避免panicif -1 < index && index < len(arr) {return arr[index], nil}return 0, errors.New("index out of range")
}

recover() 函数

/*
recover()	函数  用于终止异常处理流程		类似于	try...except...
recover()	要配置defer执行
defer	延迟处理语句  -->先放进去的后执行
*/
package mainimport ("fmt"
)func main() {fmt.Println("this is defer test!")defer fmt.Println(100)defer fmt.Println(200)fmt.Println("this is defer test2...")getlem(3)
}func getlem(index int) int {defer func() {if r := recover(); r != nil {fmt.Println("something error!", r)}fmt.Println("defer 语句!")}() //不管有没有panic  在退出函数执行之前,defer语句都会执行arr := [3]int{5, 6, 7}panic("手动抛出异常")//类似于python里面的raisereturn arr[index]
}

文件操作

使用os打开

package mainimport ("bufio""fmt""io""os"
)/*
文件操作
打开文件  --  os.Open  os.OpenFile
os.Open     只能以只读的方式打开文件
os.OpenFile 可以指定文件的打开方式,权限等
*/func main() {/*OpenFile    指定文件打开方式O_RDONLY    只读O_WRONLY    只写O_RDWR      读写*/file, e := os.OpenFile("test.txt", os.O_RDONLY, 777)if e != nil {fmt.Println("打开文件失败!")} else {//使用Read读取// data := make([]byte, 10)// for {//  len, _ := file.Read(data)//每次读取到内容长度,就是data的大小,适用于大文件读取//  if len == 0 {//长度为0,表示读取完成//      break//  }//  fmt.Println("每次读取:", string(data))// }//使用bufio读取  方式灵活  可以指定按行读取或者按分隔符读取  速度相对慢一点reader := bufio.NewReader(file)//按行读取for {line, _, e := reader.ReadLine()if e == io.EOF { //读到行尾break}fmt.Println("按行读:", string(line))}file.Seek(0,0)//移动文件指针到最开始位置}file.Close() //关闭打开文件,释放占用内存资源
}

使用ioutil打开

package mainimport ("fmt""io/ioutil"
)func main() {//使用ioutil读取   速度快  一次性读完,适合小文件读取file3, _ := ioutil.ReadFile("test.txt")fmt.Println(string(file3))
}

写文件

//写文件  io.WriteString   file.WriteString   bufio.NewWriterfile, _ := os.OpenFile("test.txt", os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0777)n, _ := io.WriteString(file, "this is io.WriteString\n")fmt.Println("n是字节数:", n)file.WriteString("直接使用打开文件写入!\n")
http://www.lryc.cn/news/596370.html

相关文章:

  • JAVA API (三):从基础爬虫构建到带条件数据提取 —— 详解 URL、正则与爬取策略
  • M3088NL是一款网络滤波器/变压器支持100M和1000M网络环境,适用于高速网络传输场景M3088
  • 在腾讯云上安装gitlab
  • HCIP第一二章笔记整理
  • 网络基础DAY16-MSTP-VRRP
  • 公司内部网址怎么在外网打开?如何让外网访问内网的网站呢?
  • 5G工业路由器如何凭借高性价比助力多行业数字化转型?
  • Hugging Face 模型的缓存和直接下载有什么区别?
  • TI DLP3010光机与相机触发使用指南
  • Android app如果不适配Android 15会怎么样
  • 一款基于 WPF 开源、功能全面的串口调试工具
  • 【Spark征服之路-3.7-Spark-SQL核心编程(六)】
  • Aspose.Cells 应用案例:法国能源企业实现能源数据报告Excel自动化
  • 中国科技信息杂志中国科技信息杂志社中国科技信息编辑部2025年第14期目录
  • stm32 智能小车
  • vue2使用v-viewer实现自动预览
  • S2B2C电子商务模式介绍
  • 【Pytest】从配置到固件的使用指南
  • Vue底层换成啥了?如何更新DOM的?
  • YOLO-实例分割头
  • 大数据量查询计算引发数据库CPU告警问题复盘
  • 静态登录界面
  • vscode,cursor,Trae终端不能使用cnpm、npm、pnpm命令解决方案
  • 类加载过程及双亲委派模型
  • git push新版问题解决
  • 以 Everoute 替代 VMware NSX:关键能力可对标,使用和运维更简单
  • 单片机的几种GPIO输入输出模型详解
  • Linux CentOS 虚拟机升级内核至4.x以上版本
  • 对随机生成的html文件做标签简析
  • CentOS 7 安装nginx