0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

panicとrecover

プログラムの強制終了を扱う際にpanicとrecover関数を用いる。
※実際にプログラムではpanicとrecoverを書くことは推奨されていない

panicでプログラムを強制終了させる。

panicは実行中のプログラムを停止させる組み込み関数。
ここでは、thirdPartyConnectDB関数を作成し関数内でpanic関数を呼び出す。panicの引数には「Unable to connect database」という文字列を指定する。このthirdPartyConnectDB関数を、saveという関数から呼び出し、main関数でsave関数を呼び出す。
main関数の最後にsave関数が実行できたか確認するために、「OK?」と表示される処理書く。このプログラム実行により、プログラムが強制終了し「panic(Unable to connect database)」とスタックトレースの情報が出力される。
※スタックトレースとは
プログラムの実行中にエラーや例外が発生した際に、そのエラーがどこで、どのような経路をたどって発生したのかを示す情報
以下の情報を含むことが多い:

・エラーが発生したメソッドや関数の名前
・エラーが発生したファイルの名前と行番号
・エラーが発生する前に呼び出されたメソッドや関数の呼び出し履歴

func thirdPartyConnectDB() {
    panic("Unable to connect database")
}

func save() {
    thirdPartyConnectDB()
}

func main() {
    save()
    fmt.Println("OK?")
}


//以下のように表示される
panic: Unable to connect database

goroutine 1 [runnning]:
main.thirdPartyConnectDB(...)
以下略

発生したpanicをrecoverで処理する

panicで発生したエラーを処理するためには、recoverを使用する。
save関数の中に、deferを使って遅延実行する関数リテラルを作る。関数リテラルでは、変数sにrecoverの返り値を入れて、fmt.Printlnで表示する。
deferで書いた関数を実行するためには後ろに()をつける。このプログラムを実行すると、panic関数とmain関数の最後に書いたしょりである「OK?」が表示される。

func thirdPartyConnectDB() {
    panic("Unable to connect database")
}

func save() {
    defer func() {           //deferで関数を作成
        s := recover()
        fmt.Println(s)
    }()            //()をつけて実行
    thirdPartyConnectDB()
}

func main() {
    save()
    fmt.Println("OK?")
}

//以下のように表示される
Unable to connect database
OK?

上記ではpanicのスタックトレースが表示されずにコードを実行することができた。
thirdPartyConnectDB関数で発生したpanicをsave関数の中のdeferで実行されたrecover関数がキャッチすることにより強制終了を防いでいる。

※注意
save関数のなかで、defer処理を定義する前にthirdPartyConnectDB関数を呼び出してしますとpanicでプログラムが終了してしまう。これは、deferでrecoverの遅延実行を指定する前に、panicが発生してしまうためである。

学習に使用した教材

・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP

・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?