1.由内置函数捕获异常,并输出错误信息
该方法需要借助内置函数recover()来捕获错误信息,在程序中需要借助defer来实现,即在某个函数中需要先将判断错误、打印错误信息的方法入栈,待函数执行完毕后再弹栈,若有错误则打印出相关信息,该方法可以使得该函数的后续代码仍正常执行,不会因为函数中的错误而终止后续所有代码的执行。
程序示例如下:
package main
import (
"fmt"
)
func test() {
defer func () {
err := recover() //捕获错误信息
if err!= nil {
fmt.Println("err=",err) //若有错则打印错误信息
}
}()
num1 := 10
num2 := 0
res := num1 / num2 //此处分母不能为0
fmt.Println(res)
}
func main() {
test()
fmt.Println("Main is running!") //test方法有错,但该语句仍能执行
}
结果如下:
err= runtime error: integer divide by zero
Main is running!
2.通过自定义错误输出错误信息,并退出程序
在go中的errors包有个New()方法,我们可以通过调用该包的New()函数自定义错误信息,函数返回error类型。除此之外,还需通过panic()内置函数打印错误信息并终止程序,而panic函数接收一个接口(interface{})类型的值,即任何值都可以作为参数。
官方文档如下:
func panic
func panic(v interface{})
内建函数panic停止当前Go程的正常执行。当函数F调用panic时,F的正常执行就会立刻停止。F中defer的所有函数先入后出执行后,F返回给其调用者G。G如同F一样行动,层层返回,直到该Go程中所有函数都按相反的顺序停止执行。之后,程序被终止,而错误情况会被报告,包括引发该恐慌的实参值,此终止序列称为恐慌过程。
程序示例如下:
package main
import (
"fmt"
"errors"
)
func readConf(name string) error {
if name == "config.ini"{
return nil
}else{
return errors.New("文件读取错误!")
}
}
func main() {
err := readConf("config1.ini") //此时输入的字符串并不满足要求
if err != nil {
panic(err) //打印错误信息,终止程序,Println函数不会执行
}
fmt.Println("文件输入正确!")
}