English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Golang 基礎トレーニング

Golang 制御文

Golang 関数 & メソッド

Golang 構造体

Golang スライス & 配列

Golang 文字列(String)

Golang ポインタ

Golang インターフェース

Golang 并行

Golang エラー(Error)

Golang 他の雑多

Go 言語のPanic

Panicは、エラー状況を処理するために使用するメカニズムです。緊急事態は関数の実行を中止するために使用できます。関数がpanicを呼び出した場合、その実行は停止し、関連する遅延関数に制御フローが移行します。

この関数の呼び出し元も終了され、呼び出し元の遅延関数も実行されます(あれば)。このプロセスはプログラムの終了まで続きます。現在のエラー状況を報告します。

この終了シーケンスはpanicと呼ばれ、内蔵関数recoverで制御できます。

panicの例1:

package main
import "os"
func main() {
	panic("エラー状況")
	_, err := os.Open("/tmp/file)
	if err != nil {
		panic(err)
	}
}

出力:

panic: エラー状況
goroutine 1 [実行中]:
main.main()
/Users/pro/GoglandProjects/Panic/panic example1.go:6 +0x39

panicの例2

package main
import "fmt"
func main() {
	fmt.Println("mainからxを呼び出し.")
	x()
	fmt.Println("xから復旧.")
}
func x() {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("xで復旧", r)
		}
	}()
	fmt.Println("xを実行中...")
	fmt.Println("yを呼び出し.")
	y(0)
	fmt.Println("yから通常に復旧.")
}
func y(i int) {
	fmt.Println("yを実行中....")
	if i > 2 {
		fmt.Println("パニック中!")
		panic(fmt.Sprintf("%v", i))
	}
	defer fmt.Println("yで遅延", i)
	fmt.Println("yで印刷", i)
	y(i + 1)
}

出力:

mainからxを呼び出し。
xを実行中...
yを呼び出し。
yを実行中....
yで印刷0
yを実行中....
yで印刷 1
yを実行中....
yで印刷 2
yを実行中....
パニック中!
yで遅延 2
yで遅延 1
yで遅延
xで復旧 3
xから返却