Go言語異常処理deferpanicrecover

4653 ワード

Go言語は簡潔で優雅さを追求するため、Go言語は伝統的なtry...catch...finallyという異常をサポートしない.Go言語の設計者たちは、異常と制御構造を混ぜ合わせるとコードが混乱しやすいと考えているからだ.開発者は異常を乱用しやすく、小さな間違いさえ異常を投げ出すからだ.Go言語では、多値戻りを使用してエラーを返します.エラーの代わりに例外を使用しないでください.プロセスを制御するために使用しないでください.極めて個別の場合、すなわち、真の異常に遭遇した場合(例えば除数が0になった).Goに導入されたException処理:defer,panic,recoverのみが使用されます.
これらの異常の使用シーンは、Goでpanicの異常を放出し、deferでrecoverによってこの異常をキャプチャし、正常に処理することができると簡単に説明できます.
例コード:
package main

 

import "fmt"

 

func main(){

    defer func(){ //       defer,       panic  

        fmt.Println("c")

        if err:=recover();err!=nil{

            fmt.Println(err) //    err    panic     ,55

        }

        fmt.Println("d")

    }()

    f()

}

 

func f(){

    fmt.Println("a")

    panic(55)

    fmt.Println("b")

    fmt.Println("f")

}

    :

a
c
55
d
exit code 0, process exited normally.

参照先:http://blog.csdn.net/ghost911_slb/article/details/7831574
defer
defer英文原意:vi.延期;延期するに従う   vt.遅らせる;延期させる.
deferの考え方はC++の解析関数に似ていますが、Go言語の「解析」はオブジェクトではなく関数であり、deferは関数の終了時に実行される文を追加するために使用されます.ここで強調するのは、C++とは異なる構造関数が静的であり、Goのdeferが動的であるため、指定ではなく追加です.
func f() (result int) {
  defer func() {
    result++
  }()
  return 0
}

上の関数は0を返します.まだdeferを追加する時間がないので、関数は戻ります.
さらに、deferは複数回、deferスタックを形成することができ、後のdeferの文は関数が戻るときに先に呼び出される.
参照先:http://weager.sinaapp.com/?p=31
panic
panic英文原意:n.パニック、パニック;大恐慌  adj.パニック;理由のない  vt.パニックになる  vi.あわてた
panicは、非常に深刻なリカバリ不可能なエラーを表すために使用されます.Go言語では、interface{}タイプの値(つまり任意の値)をパラメータとして受信する内蔵関数です.panicの役割は私たちが普段接触している異常のようなものです.ただし、Goにはtry...catchがないため、panicは通常、recoverを除くプログラムを停止させます.だから、Go言語の異常、それは本当に異常です.試してみてください.panicを呼び出してみてください.プログラムはすぐに停止し、Goが実行されると呼び出しスタックが印刷されます.しかし、肝心なのは、関数が実行されている間にpanicが実行されても、関数が下に行かなくなっても、実行時にすぐにpanicを上に渡すのではなく、deferに着いて、deferのものが走ってしまったら、panicが上に伝えることです.だからこのときdeferはtry-catch-finallyのfinallyに似ています.panicはこんなに簡単です.本当の意味での異常を投げ出す.
recover
recover英文原意:vt.回復;補う再取得   vi.回復;勝訴するボールを取りなおす   n.予備姿勢に復帰
前述したように、panicの関数はすぐに戻るのではなく、先にdeferしてから戻ります.この場合(deferの場合)、panicをキャプチャし、panic伝達を阻止する方法があれば、異常な処理メカニズムが整備される.
Go言語はrecover内蔵関数を提供しています.前述したように、panicになると論理はdeferに進みます.私たちはdeferで待っています.recover関数を呼び出すと現在のpanic(もしあれば)にキャプチャされ、キャプチャされたpanicは上に伝わらず、世界は平和を取り戻しました.君はやりたいことをすることができる.
しかし、recover以降、論理はpanicの点に回復せず、関数はdeferの後に返されることに注意してください.
Goでtry catchのような異常処理を実現する例は以下の通りである.
http://www.douban.com/note/238705941/
結論:
Goは異常の存在を全面的に否定するとともに,異常の多用を極力奨励しない.
参照先:http://blog.dccmx.com/2012/01/exception-the-go-way/
http://kejibo.com/golang-exceptions-handle-defer-try/
http://bookjovi.iteye.com/blog/1335282
https://github.com/astaxie/build-web-application-with-golang/blob/master/02.3.md