Go言語 ~基礎編~ エラーハンドリング

go

今回は、エラーハンドリングについて学びましょう。

学習記事まとめ

エラーハンドリング

Go言語に限らず、全てのプログラミング言語にとってエラーハンドリングは重要です。

例えば、Go言語では関数の戻り値にError typeを定義し、関数呼び出し後の条件判定に使用します。

簡単なサンプルを載せておきます。

上記のコードは、data.txtから数値を読み取って合計値を求めるサンプルコードです。実行してみましょう。

問題なく実行できましたね。しかし、このプログラムはstringの数値をfloatに型変換するものなので、文字列など数値に変換できない値が入った場合はエラーが発生します。

このような場合、「Close file」の呼び出しが無いことがわかります。つまり、一度開いたファイルが閉じられていない状態でプログラムが終了してしまっています。

遅延関数の呼び出し

関数やメソッドの呼び出しの先頭に「defer」キーワードをつけて実装するとそれらを”遅延状態“にすることができます。

サンプルコードを書きます。

このプログラムを実行すると結果はどうなると思いますか?少し考えてください。

KOUKI
KOUKI

答えはこれです。

通常ならGoodbye->Mr.Yamada->Helloの順に呼び出されるはずですが、Hello->Mr.Yamada->Goodbyeとなっています。

実は、deferキーワードと共に関数やメソッドを宣言すると「処理の終了時」に呼び出されるようになります。

もう一つ例をあげてみましょう。

この結果はどうなると思いますか?

プログラムを実行して確認してみましょう。

「3->2->1」と出力されました。deferキーワード同士では一番最後に定義されたものが一番最初に呼び出されるようです。

deferキーワードの使い所

deferキーワードは、結構便利です。return文の実行後に処理を実行できます。

注目して欲しいのは、普通の関数(“You want to talk with me?”)の方は処理が出力されていないところです。

やってみよう

deferキーワードを設定すると「どんな場合」でも実行したい処理を呼び出すことができそうです。

deferキーワードを使って、冒頭に実装したサンプルコードを書き換えてみましょう。このサンプルコードで問題になったのは、「ファイルが開いたまま処理が終了すること」でしたね。

data.txtの中身を以下のようにして実行します。

今度は、Close fileが出力されました。

このように必ず処理したい関数やメソッドの前にdeferを定義しておくと便利そうです。

panicを起こせ!

Go言語では、不適切な処理に直面すると”panic“が発生します。

例えば、次のような処理の場合です。

Arrayのindexを超えた要素にアクセスした際に、panicが発生しました。

panicは、意図的に発生させることも可能です。

Stack Trace

panicが発生すると一緒にStack Traceが吐き出されます。これは、エラー原因を探るのに適しています。

Stack Traceは、関数の呼び出し先から順に出力されます。

例えば、次のような感じです。

panicとdeferキーワードの併用

deferキーワードをpanicと共に使用すると、プログラムがクラッシュする前にdeferをつけた関数が実行されます。

one関数とtwo関数にそれぞれdeferをつけた関数を設定しました。この状態でプログラムを実行します。

プログラムがクラッシュする前に、deferキーワードで定義された関数が実行されたことがわかりますね。

recover関数

時折、Stack Traceの出力結果は開発者にとって見にくくなる場合があるため、表示したくない場合があるかもしれません。

そんな時は、recover関数が便利です。

recover関数は、Go言語の組み込み関数の一つで、プログラムがパニックになっているときに呼び出すと、パニックが停止します。

例えば、次のように使用します。

プログラムを実行してみましょう。

PanicおよびStack Traceが発生していないことがわかります。

ちなみに、panicは発生しなかった場合、recover関数自体はnilを返します。

注意点としては、panic関数の後にrecover関数を実行してもrecover関数が実行されないことです。

recover関数の戻り値

前述の通り、panicが発生していない場合、recover関数はnilを返します。

しかし、panicが発生した場合は、panicへ渡された値を返却します。

まとめ

KOUKI
KOUKI

最後にこの章で学んだことをまとめます。

エラーハンドリング まとめ
・ deferキーワードを用いるとエラーが発生しても実行したい処理を実行できる
・ panic関数で意図的にエラーを発生させることができる
・ recover関数を用いるとプログラムのクラッシュを停止できる
・ panic時に発生するStack Traceはデバッグ時に役立つ
・ panicが発生していない時にrecover関数を呼び出すとnilを返す
・ panicへ渡したメッセージをrecover関数から取得できる

次回

次回は、GoroutineとChannelについて学びましょう。

参考書籍

コメントを残す