2016-04-19 1 views
2

Iは、ライブラリパニックからrecover() Sを使用し、それは次のように簡略化コードを使用した:関数ブレークを呼び出すのはrecover()ですか?

func main() { 
    defer rec() 
    panic("X") 
} 

func rec() { 
    rec2() 
} 

func rec2() { 
    fmt.Printf("recovered: %v\n", recover()) 
} 

本の出力は、次のとおり代わり

recovered: <nil> 
panic: X 
... more panic output ... 

なお、recover()戻るnilエラーのこれは意図された動作ですか?

答えて

2

recoverは、遅延関数によって直接呼び出される必要があります。 language specから

次のいずれかの条件が 保持している場合に回復の戻り値はnilである:

  • パニックの引数がゼロでした。
  • ゴルーチンはパニックではありません。
  • リカバリは遅延機能によって直接呼び出されませんでした。
+0

遅延機能から(recがメインで遅延された)recover()は呼び出されませんでしたか?私はあなたを信じている、私はちょうどかなり理解していない:) –

+2

@ william.taylor.09:いいえ、ここでの遅延関数は 'rec'であり、' rec'は* rec *を直接呼び出します。 'rec2'は' recover() 'を呼び出すものです。遅延を 'rec2()'に変更すると、パニックをキャッチします。 – JimB

+0

ああ、私は確かに誤読。ありがとう! –

関連する問題