Day17# panic & recover

第 17 天要介绍 golang 的例外处理,那麽我们就进入正题吧 ─=≡Σ(((っ゚∀゚)っ

panic

虽然说是例外处理,但其实 Go 并没有真的抛出例外的机制,而是透过 panic 来让当前执行的程序码中断流程。

package main

import (
	"fmt"
	"time"
)

func main() {
	cat := ""
	go func() {
		defer func() {
			fmt.Println("我是 defer")
		}()

		if cat == "" {
			panic("我是 panic!")
		}
	}()

	time.Sleep(1 * time.Second)
	fmt.Println("这是 main 的最尾排")
}

// => 我是 defer
//    panic: 我是 panic!

在进入 panic 的情境下,会在结束当下的 goroutine 并进行 defer,而这时候搭配 recover 服用,这样就能够撷取到 panic 的状况进而达成类似 try...catch... 的方法。

recover

我们在执行程序时,不会希望一个小错误就导致整个程序码坏光光。
而 recover 能够在接收到 panic 状况时,作出处理的行为,这样被中断的程序码就能够继续向下执行。

package main

import (
	"fmt"
	"time"
)

func main() {
	cat := ""
	func() {
		defer func() {
			if err := recover(); err != nil {
				fmt.Println("让开,我来 Recover!")
			}
		}()

		if cat == "" {
			fmt.Println("即将进入 panic 状态")
			panic("我是 panic!")
		}
	}()

	time.Sleep(1 * time.Second)
	fmt.Println("这是 main 的最尾排")
}

// => 即将进入 panic 状态
//    让开,我来 Recover!
//    这是 main 的最尾排

有了 recover 後,就能够让函式继续往下执行。

结尾

有任何问题欢迎与我告知 :)
本篇文章同步更新於我的部落格


<<:  Day 28 - 新鲜人第一份工作的心得与重要性

>>:  【第十八天 - 命令执行】

[Day - 18] - Spring SOA架构之领域驱动设计之旅

Abstract 在一个广大领域需求的市场,无论你身处哪种开发情境下,势必都会遇到需要开发API进行...

Day30 - 云端 Study Lab 总结,清除 GCP 专案

Study Lab 总结 在这 30 天中介绍了许多 DevOps 的工具以及工作流程,若读者想要学...

Day3 - numpy(2) 基本索引

今天的重点 索引 基本索引: 先建立一个4x3的ndarray来让我们实际操作 阵列索引是由外而内的...

[神经机器翻译理论与实作] Google Translate的神奇武器- Seq2Seq (III)

前言 今天继续我们未完成的建模大业吧! 我们要建立的seq2seq模型由LSTM编码器与解码器串接而...

Day21 vue.js网站删除特定文章

延续昨日 今天来完善我们的 我的专案的功能吧! 首先这是目前的我的专案 再来新增2个按钮 嘟嘟噜新增...