從恐慌中恢復過來

一個常見的錯誤是宣告一個切片並開始從中請求索引而不進行初始化,這會導致索引超出範圍的恐慌。以下程式碼解釋瞭如何在不退出程式的情況下從恐慌中恢復,這是恐慌的正常行為。在大多數情況下,以這種方式返回錯誤而不是在恐慌中退出程式僅對開發或測試目的有用。

type Foo struct {
    Is []int
}

func main() {
    fp := &Foo{}
    if err := fp.Panic(); err != nil {
        fmt.Printf("Error: %v", err)
    } 
    fmt.Println("ok")
}

func (fp *Foo) Panic() (err error) {
    defer PanicRecovery(&err)
    fp.Is[0] = 5
    return nil
}

func PanicRecovery(err *error) {

    if r := recover(); r != nil {
        if _, ok := r.(runtime.Error); ok {
             //fmt.Println("Panicing")
             //panic(r)
             *err = r.(error) 
        } else {
            *err = r.(error)
        }
    }
}

使用單獨的函式(而不是閉包)允許在易於恐慌的其他函式中重用相同的函式。