1.定义错误

err := errors.New(“math - square root of negative number”)

2.panic

panic 可以直接从代码初始化:当错误条件(我们所测试的代码)很严苛且不可恢复,程序不能继续运行时,可以使用 panic 函数产生一个中止程序的运行时错误。
panic 接收一个做任意类型的参数,通常是字符串,在程序死亡时被打印出来。Go 运行时负责中止程序并给出调试信息。

  1. package main
  2. import "fmt"
  3. func main() {
  4. fmt.Println("123")
  5. panic("asfsafd")
  6. fmt.Println("sdkfj")
  7. }

image.png

go panicking:
在多层嵌套的函数调用中调用 panic,可以马上中止当前函数的执行,所有的 defer 语句都会保证执行并把控制权交还给接收到 panic 的函数调用者。这样向上冒泡直到最顶层,并执行(每层的) defer,在栈顶处程序崩溃,并在命令行中用传给 panic 的值报告错误情况:这个终止过程就是 panicking

3.从panic中恢复

(recover)内建函数被用于从 panic 或 错误场景中恢复:让程序可以从 panicking 重新获得控制权,停止终止过程进而恢复正常执行。
recover 只能在 defer 修饰的函数中使用:用于取得 panic 调用中传递过来的错误值,如果是正常执行,调用 recover 会返回 nil,且没有其它效果。
总结:panic 会导致栈被展开直到 defer 修饰的 recover() 被调用或者程序中止。

  1. package main
  2. import "fmt"
  3. func badCall() {
  4. panic("bad end")
  5. }
  6. func test() {
  7. defer func() {
  8. if e := recover(); e != nil {
  9. fmt.Printf("panucung %s\r\n", e)
  10. }
  11. }()
  12. badCall()
  13. fmt.Printf("after bad call\r\n")
  14. }
  15. func main() {
  16. fmt.Printf("calling test \r\n")
  17. test()
  18. fmt.Printf("test completed\r\n")
  19. }