エラーハンドリングとは
プログラムにエラーが発生したときの処理をエラーハンドリングという。このときにエラーの内容を表示させて原因をわかりやすくさせるなど、エラーハンドリングは重要な意味を持つ。
エラーハンドリングの実施
エラーが発生したとき、どのように処理をするか。例えば、コードを書いたファイルをos.Openで読み込んだファイルの内容を変数file、エラーの内容をerrに入れる。エラーがある場合(変数errがnilではない場合)は、log.Fatallnで「Error!」と表示させる。
※nilとは?
他のプログラミング言語におけるnullやNoneと同じ概念。nilは値が存在しないことを示すために使用される。
func main() {
file, err := os.Open("./lesson.go") //ファイルを開く
if err != nil{ //ファイルを開いたときのエラーハンドリング
log.Fatallm("Error!")
}
defer file.Close() //エラーがなければファイルを最後に閉じる
}
os.Open関数は戻り値としてfileとerrの二つの戻り値を返す。
次にデータを書き込むためのbyte型スライスを作成し、変数dataに入れる。なお、byte型のスライスは、バイト配列と呼ばれることもよくある。
data := make([]byte,100) //バイト配列の作成
次にReadメソッドでファイルの内容を変数dataに読み込む。ここでも同様にエラーがnilでなければlog.Fatallnで「Error」を出力して処理を終了する。
Readメソッドの返り値として、読み込んだbyte数を変数countにエラーの内容を変数errに入れる。ここでサイドエラーハンドリングをする。
count, err := file.Read(data)
if err != nil {
log.Fatalln("Error!")
}
最後に、変数countの値とstring型でcastした変数dataを表示する。実行すると100byte分読み込まれたコードが表示される。実行結果の最初の「100」は
100byte分が読み込まれたという意味。
import(
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("./lesson.go") //ファイルを開く
if err != nil{ //ファイルを開いたときのエラーハンドリング
log.Fatalln("Error!")
}
defer file.Close()
data := make([]byte,100)
count, err := file.Read(data)
if err != nil {
log.Fatalln("Error!")
}
fmt.Println(count, string(data))
}
//以下のように出力される
100 package main (byte数(100)が表示されたあと、ファイルの中身が表示される)
import(
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("./lesson.go") //ファイルを開く
if
↑ここまで出力範囲
※ほかのプログラミング言語では、エラーハンドリングをtry catchなどの方法で行うが、Go言語ではコードがエラーを返したとにエラーハンドリングを行う。そのため、エラーハンドリングのコードが複数になる。
また、エラーを返すパターンではどうなるかを確かめるために、ディレクトリを移動するos.Chdir関数の引数に存在しないディレクトリである「"test"」を指定する。この返り値を変数errに代入し、エラーがある場合はlog.Fatallnでコードを終了する
以下のコードをこれまで作成したものに追加する。
package main
import (
"fmt"
"log"
"os"
)
func main() {
file, err := os.Open("./lesson.go")
if err != nil {
log.Fatalln("Error!")
}
defer file.Close()
data := make([]byte, 100)
count, err := file.Read(data)
if err != nil {
log.Fatalln("Error")
}
fmt.Println(count, string(data))
//追加した範囲
err = os.Chdir("test")
if err != nil {
log.Fatalln("Error")
}
}
//実行結果はtestというディレクトリは存在しないため以下のようになる。
100 package main
import(
"fmt"
"os"
"log"
)
func main() {
file, err := os.Open("./lesson.go")
if
2025/01/12 18:11:02 Error!
学習に使用した教材
・『入門】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