异常处理

error接口

Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:

type error interface {Error() string
}

Go语言的标准库代码包errors为用户提供如下方法:

package errorstype errorString struct { text string
}func New(text string) error { return &errorString{text}
}func (e *errorString) Error() string { return e.text
}

另一个可以生成error类型值的方法是调用fmt包中的Errorf函数:

package fmt
import "errors"func Errorf(format string, args ...interface{}) error {return errors.New(Sprintf(format, args...))
}

示例代码:

import ("errors""fmt"
)func main() {var err1 error = errors.New("a normal err1")fmt.Println(err1) //a normal err1var err2 error = fmt.Errorf("%s", "a normal err2")fmt.Println(err2) //a normal err2
}

函数通常在最后的返回值中返回错误信息:

import ("errors""fmt"
)func Divide(a, b float64) (result float64, err error) {if b == 0 {result = 0.0err = errors.New("runtime error: divide by zero")return}result = a / berr = nilreturn
}func main() {r, err := Divide(10.0, 0)if err != nil {fmt.Println(err) //错误处理 runtime error: divide by zero} else {fmt.Println(r) // 使用返回值}
}

panic

在通常情况下,向程序使用方报告错误状态的方式可以是返回一个额外的error类型值。

但是,当遇到不可恢复的错误状态的时候,如数组访问越界、空指针引用等,这些运行时错误会引起painc异常。这时,上述错误处理方式显然就不适合了。反过来讲,在一般情况下,<font color=#FF0000 我们不应通过调用panic函数来报告普通的错误,而应该只把它作为报告致命错误的一种方式。当某些不应该发生的场景发生时,我们就应该调用panic。

一般而言,当panic异常发生时,程序会中断运行,并立即执行在该goroutine(可以先理解成线程,在中被延迟的函数(defer 机制)。随后,程序崩溃并输出日志信息。日志信息包括panic value和函数调用的堆栈跟踪信息。

不是所有的panic异常都来自运行时,直接调用内置的panic函数也会引发panic异常;panic函数接受任何值作为参数。

字符串处理

字符串在开发中经常用到,包括用户的输入,数据库读取的数据等,我们经常需要对字符串进行分割、连接、转换等操作,我们可以通过Go标准库中的strings和strconv两个包中的函数进行相应的操作。

字符串操作

下面这些函数来自于strings包,这里介绍一些我平常经常用到的函数,更详细的请参考官方的文档。

Contains

func Contains(s, substr string) bool
功能:字符串s中是否包含substr,返回bool值

示例代码:

    fmt.Println(strings.Contains("seafood", "foo"))fmt.Println(strings.Contains("seafood", "bar"))fmt.Println(strings.Contains("seafood", ""))fmt.Println(strings.Contains("", ""))//运行结果://true//false//true//true

Join

func Join(a []string, sep string) string
功能:字符串链接,把slice a通过sep链接起来

示例代码:

    s := []string{"foo", "bar", "baz"}fmt.Println(strings.Join(s, ", "))//运行结果:foo, bar, baz

Index

func Index(s, sep string) int
功能:在字符串s中查找sep所在的位置,返回位置值,找不到返回-1

示例代码:

    fmt.Println(strings.Index("chicken", "ken"))fmt.Println(strings.Index("chicken", "dmr"))//运行结果://    4//    -1

Repeat

func Repeat(s string, count int) string
功能:重复s字符串count次,最后返回重复的字符串

示例代码:

    fmt.Println("ba" + strings.Repeat("na", 2))//运行结果:banana

Replace

func Replace(s, old, new string, n int) string
功能:在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换

示例代码:

    fmt.Println(strings.Replace("oink oink oink", "k", "ky", 2))fmt.Println(strings.Replace("oink oink oink", "oink", "moo", -1))//运行结果://oinky oinky oink//moo moo moo

Split

func Split(s, sep string) []string
功能:把s字符串按照sep分割,返回slice

示例代码:

    fmt.Printf("%q\n", strings.Split("a,b,c", ","))fmt.Printf("%q\n", strings.Split("a man a plan a canal panama", "a "))fmt.Printf("%q\n", strings.Split(" xyz ", ""))fmt.Printf("%q\n", strings.Split("", "Bernardo O'Higgins"))//运行结果://["a" "b" "c"]//["" "man " "plan " "canal panama"]//[" " "x" "y" "z" " "]//[""]

Trim

func Trim(s string, cutset string) string
功能:在s字符串的头部和尾部去除cutset指定的字符串

示例代码:

    fmt.Printf("[%q]", strings.Trim(" !!! Achtung !!! ", "! "))//运行结果:["Achtung"]

Fields

func Fields(s string) []string
功能:去除s字符串的空格符,并且按照空格分割返回slice

示例代码:

    fmt.Printf("Fields are: %q", strings.Fields("  foo bar  baz   "))//运行结果:Fields are: ["foo" "bar" "baz"]

字符串转换

字符串转化的函数在strconv中,如下也只是列出一些常用的。

Append

Append 系列函数将整数等转换为字符串后,添加到现有的字节数组中。

    str := make([]byte, 0, 100)str = strconv.AppendInt(str, 4567, 10) //以10进制方式追加str = strconv.AppendBool(str, false)str = strconv.AppendQuote(str, "abcdefg")str = strconv.AppendQuoteRune(str, '单')fmt.Println(string(str)) //4567false"abcdefg"'单'

Format

Format 系列函数把其他类型的转换为字符串。
示例代码:

 a := strconv.FormatBool(false)b := strconv.FormatInt(1234, 10)c := strconv.FormatUint(12345, 10)d := strconv.Itoa(1023)fmt.Println(a, b, c, d) //false 1234 12345 1023

Parse

Parse 系列函数把字符串转换为其他类型。
示例代码:

package mainimport ("fmt""strconv"
)func checkError(e error) {if e != nil {fmt.Println(e)}
}
func main() {a, err := strconv.ParseBool("false")checkError(err)b, err := strconv.ParseFloat("123.23", 64)checkError(err)c, err := strconv.ParseInt("1234", 10, 64)checkError(err)d, err := strconv.ParseUint("12345", 10, 64)checkError(err)e, err := strconv.Atoi("1023")checkError(err)fmt.Println(a, b, c, d, e) //false 123.23 1234 12345 1023
}

文件操作

建立与打开文件

新建文件可以通过如下两个方法:

func Create(name string) (file *File, err Error)
根据提供的文件名创建新的文件,返回一个文件对象,默认权限是0666的文件,返回的文件对象是可读写的。func NewFile(fd uintptr, name string) *File
根据文件描述符创建相应的文件,返回一个文件对象

通过如下两个方法来打开文件:

func Open(name string) (file *File, err Error)
该方法打开一个名称为name的文件,但是是只读方式,内部实现其实调用了OpenFile。func OpenFile(name string, flag int, perm uint32) (file *File, err Error)
打开名称为name的文件,flag是打开的方式,只读、读写等,perm是权限

写文件

func (file *File) Write(b []byte) (n int, err Error)
写入byte类型的信息到文件func (file *File) WriteAt(b []byte, off int64) (n int, err Error)
在指定位置开始写入byte类型的信息func (file *File) WriteString(s string) (ret int, err Error)
写入string信息到文件

读文件

func (file *File) Read(b []byte) (n int, err Error)
读取数据到b中func (file *File) ReadAt(b []byte, off int64) (n int, err Error)
从off开始读取数据到b中

删除文件

func Remove(name string) Error
调用该函数就可以删除文件名为name的文件

案例:拷贝文件

示例代码:

package mainimport ("fmt""io""os"
)func main() {args := os.Args //获取用户输入的所有参数//如果用户没有输入,或参数个数不够,则调用该函数提示用户if args == nil || len(args) != 3 {fmt.Println("useage : xxx srcFile dstFile")return}srcPath := args[1] //获取输入的第一个参数dstPath := args[2] //获取输入的第二个参数fmt.Printf("srcPath = %s, dstPath = %s\n", srcPath, dstPath)if srcPath == dstPath {fmt.Println("源文件和目的文件名字不能相同")return}srcFile, err1 := os.Open(srcPath) //打开源文件if err1 != nil {fmt.Println(err1)return}dstFile, err2 := os.Create(dstPath) //创建目的文件if err2 != nil {fmt.Println(err2)return}buf := make([]byte, 1024) //切片缓冲区for {//从源文件读取内容,n为读取文件内容的长度n, err := srcFile.Read(buf)if err != nil && err != io.EOF {fmt.Println(err)break}if n == 0 {fmt.Println("文件处理完毕")break}//切片截取tmp := buf[:n]//把读取的内容写入到目的文件dstFile.Write(tmp)}//关闭文件srcFile.Close()dstFile.Close()
}

第八章 异常处理和字符串处理和文件操作相关推荐

  1. Chapter3:字符串编码和文件操作

    #!/usr/bin/python # -*- coding utf8 -*-''' 字符编码补充内存: Unicode格式的二进制decode encode ↑ | ↑ | | ↓ | ↓ 硬盘:u ...

  2. Python 开发-2 (文件操作,正则表达式,类,JSON,装饰器,异常处理,Socket)

    文章目录 文件操作 递归创建目录 删除文件或目录 拷贝文件 修改文件名或目录名 文件路径名操作 判断文件,目录是否存在 文件大小与修改时间 当前目录与目录切换 遍历目录文件 遍历目录下指定后缀 目录文 ...

  3. python 移动文件语句_[转]Python文件操作

    这里的"文件"不单单指磁盘上的普通文件,也指代任何抽象层面上的文件.例如:通过URL打开一个Web页面"文件",Unix系统下进程间通讯也是通过抽象的进程&qu ...

  4. 【JAVA SE】第八章 异常处理与抽象类

    第八章 异常处理与抽象类 文章目录 第八章 异常处理与抽象类 一.异常处理 1.概念 2.Exception类的层次 3.Java 内置异常类 3.异常方法 4.捕获异常 5.多重捕获块 6.thro ...

  5. Part1_4 python函数、文件操作、异常处理

    目录 函数 文件操作 异常处理 函数 #函数的定义 def printinfo():print("----------")print("人生苦短,我用python&quo ...

  6. python 文件操作不被打断_python学习六文件操作和异常处理

    1.文件的定义和类型 什么是文件呢? 文件是数据的抽象和集合 文件是存储在辅助存储器上的数据序列 文件是存储的一种 文件有哪些类型呢? 本质上所有文件以二进制储存,不过又可以分为文本文件和二进制文件 ...

  7. Python查找包含指定字符串的所有文件

    代码功能: 查找包含指定字符串的所有文件. 技术要点: 1)广度优先遍历目录树: 2)检查文件中是否包含特定的字符串. 运行效果: 温馨提示 进入公众号,通过菜单"最新资源"==& ...

  8. Python基础——第八章:Python文件操作

    前言 本文是根据黑马程序员Python教程所作之笔记,目的是为了方便我本人以及广大同学们查漏补缺. 不想做笔记直接来我的频道.当然啦,自己的笔记才是最好的哦! PS:感谢黑马程序员! 教程链接:黑马程 ...

  9. Java统计1到300_java程序员的从0到1:统计某字符串在某文件中出现的次数(面试题)...

    目录: 1. 编程题目 2. 方法一 3. 方法二 4. 方法三 5. 方法四 6. 总结 正文: 1. 编程题目 写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数. 2. ...

最新文章

  1. 法国拟将雷诺与日产合并 代表团抵日进行谈判
  2. STM32F103ZET6开发板PB3/4,PA13/14/15等I/O口的特殊配置
  3. 【深度学习】吊打一切现有版本的YOLO!旷视重磅开源YOLOX:新一代目标检测性能速度担当!...
  4. boost::describe模块实现string转enum的测试程序
  5. BASIC-6 杨辉三角形
  6. 入门干货之Electron的.NET实现-Electron.NET
  7. python不带颜色的图形_python – 为什么seaborn pairplot中的kde子图中没有显示颜色?...
  8. 【Kafka】Kafka InvalidReceiveException: Invalid receive (size = 369296128 larger than 104857600)
  9. 蓝桥杯数字三角形java,蓝桥杯数字三角形(java)
  10. Samba 共享目录设置在Home目录下
  11. RPC架构简介与原理
  12. python中把输出结果写到一个文件中_python 文件中字符串过滤,并将结果输出到另一个文件中(源码)...
  13. Leetcode 147 Insertion Sort List
  14. CNN卷积神经网络原理讲解+图片识别应用(附源码)
  15. Couldn't find leader offsets for Set news_topic
  16. GDIplus的初次接触--加载并显示常用格式图片
  17. MySQL数据库——多表查询介绍
  18. 【刷题笔记】--lintcode木头加工(java)
  19. IDE/ATA与AHCI
  20. 【Redis】Redis高可用之Sentinel哨兵模式详解(Redis专栏启动)

热门文章

  1. sublime Text3 注册码
  2. DCache-CacheServer分析(六)
  3. 计算机系统层次模型,计算机取证的层次模型
  4. J-link工具:J-Flash Lite烧录方法
  5. Linux 多点电容触摸屏实验
  6. 设计模式 - 学习笔记 - 工厂模式Factory Pattern
  7. 谁再悄咪咪的吃掉异常,我上去就是一 JIO
  8. 驾照考试相关科目总结
  9. vue打包放到java中启动_Springboot+Vue打包部署总结
  10. 巴菲特:选择股票要学会三个诀窍