go【第七篇】异常处理
error接口
error 普通错误
Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型,该接口的定义如下:
type error interface { Error() string }
Go语言的标准库代码包errors为用户提供如下方法
// Copyright 2011 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. // Package errors implements functions to manipulate errors. package errors // New returns an error that formats as the given text. func New(text string) error { return &errorString{text} } // errorString is a trivial implementation of error. type errorString struct { s string } func (e *errorString) Error() string { return e.s }
package main import "fmt" import "errors" func main() { //var err1 error = fmt.Errorf("%s", "this is normol err") err1 := fmt.Errorf("%s", "this is normal err1") fmt.Println("err1 = ", err1) err2 := errors.New("this is normal err2") fmt.Println("err2 = ", err2) }
package main import ( "errors" "fmt" ) func main() { num, err := TestError(10, 0) if err != nil { fmt.Println(err) } else { fmt.Println(num) } // os.Open() // ctrl+b 查看go语言自己定义好的方法的源代码。 } func TestError(num1 int, num2 int) (result int, err error) { err = nil if num2 == 0 { err = errors.New("除数不能为0") return } result = num1 / num2 return }
panic
panic 严重错误
当panic异常发生时,程序会中断运行
package main import "fmt" func testa() { fmt.Println("aaaaaaaaaaaaaaaaa") } func testb() { //fmt.Println("bbbbbbbbbbbbbbbbbbbb") //显式调用panic函数,导致程序中断 panic("this is a panic test") } func testc() { fmt.Println("cccccccccccccccccc") } func main() { testa() testb() testc() }
recover
尝试从当前的异常状态恢复过来
package main import "fmt" func main() { Test(11) } func Test(n int) { defer TestRecover() var num [10] int num[n] = 12 fmt.Println(num) fmt.Println("aaaaa") } func TestRecover() { fmt.Println(recover()) } /*输出 runtime error: index out of range */
View Code
错误处理流程
golang 有2个内置的函数 panic() 和 recover(),用以主动抛出和捕获运行时发生的程序错误,与 error 不同,panic-recover 一般用在函数内部。
golang 的错误处理流程:
当一个函数在执行过程中出现了异常或遇到 panic(),正常语句就会立即终止,然后执行 defer 语句,再报告异常信息,最后退出 goroutine。 如果在 defer 中使用了 recover() 函数,则会捕获错误信息,使该错误信息终止报告。
一定要注意不要滥用 panic-recover,可能会导致性能问题
谢谢