クラッシュして回復するときのパニック/回復の概要

       

コンテンツ

1.パニックダウンタイム

第二に、回復する

3.パニックと回復の関係


        Go言語は、プログラムのダウンタイムを手動でトリガーしてプログラムをクラッシュさせることができるため、開発者は、起こりうる損失を減らしながら、タイムリーにエラーを見つけることができます。Go言語プログラムがダウンすると、スタックとゴルーチンの情報がコンソールに出力されるため、ダウンタイムでもエラーの場所を簡単に知ることができます。

1.パニックダウンタイム

func panic(v interface{})

panic()の引数は任意のタイプにすることができ、後で説明するrecover引数は、panic()から発行されたものを受け取ります。

package main
import "fmt"
func main(){
    
    defer fmt.Println("宕机后要做的事情1")
    defer fmt.Println("宕机后要做的事情2")
    fmt.Println("bb")
    panic("宕机")
    fmt.Println("dd")
    defer func(){
        fmt.Println("ee")
    }()
}

出力

bb
宕机后要做的事情2
宕机后要做的事情1
panic: 宕机
 
goroutine 1 [running]:
main.main()
    /Users/root/Desktop/test.go:9 +0xf1
exit status 2

1. panic()後のコードは実行されません

2.ただし、ダウンタイムが発生した場合でも、panic()関数の前に実行されたdeferステートメントは引き続き機能します。

第二に、回復する

Goには例外システムがなく、ダウンタイムをトリガーするためのパニックの使用は、他の言語で例外をスローするのと似ているため、recoverのダウンタイム回復メカニズムはtry/catchメカニズムに対応します。

コード実行エラーが原因でランタイムレイヤーによってスローされたパニッククラッシュであろうと、アクティブにトリガーされたパニッククラッシュであろうと、遅延と回復と連携してエラーのキャプチャと回復を実現し、クラッシュが発生した後もコードの実行を継続できます。

package main
import "fmt"
func main() {
    defer func() {
        if info := recover(); info != nil {
            fmt.Println("触发了宕机", info)
        } else {
            fmt.Println("程序正常退出")
        }
    }()
    
    fmt.Println("bbbbbb")
    fmt.Println("cccccc")
    panic("fatal error")
    fmt.Println("ddddd")
    defer func() {
        fmt.Println("eeeeeeee")
    }()
}

//代码运行
bbbbbb
cccccc
触发了宕机 fatal error

3.パニックと回復の関係

パニックと延期の組み合わせには、次の特徴があります。

  • パニックが発生し、回復せず、プログラムがクラッシュします。
  • パニックとリカバリキャプチャを使用すると、プログラムはクラッシュしません。対応する延期を実行した後、現在の機能を障害点から終了し、実行を続行します。

1)パニック/リカバリは他の言語の例外メカニズムをシミュレートできますが、通常の関数を作成するときにこの機能を頻繁に使用することはお勧めしません。

2)パニックによってトリガーされる延期機能では、引き続きパニックを呼び出し、プログラム全体がクラッシュするまでさらにエラーをスローすることができます。

3)エラーが発生したときに現在の関数の戻り値を設定する場合は、名前付き戻り値メソッドを使用して、戻り値を直接設定できます。

おすすめ

転載: blog.csdn.net/demored/article/details/124174115