以前Gunosyのサーバを全部Goに置き換えてる時に、同僚から「Goってtry-catchないの」みたいな話が出ました。
その時はそんなもの必要ないと返したんですが、せっかくゴールデンウィークなのでふざけたものつくろうと思い寝起きの10分位で適当なtry-catch実装作りました。
作ったもの
こちらです。
trycatch https://github.com/y-matsuwitter/trycatch
インストールは go get github.com/y-matsuwitter/trycatch
使い方
trycatch.go
package main
import "github.com/y-matsuwitter/trycatch"
type MyError struct {
error
}
func main() {
trycatch.TryCatch{}.Try(func() {
println("do something buggy")
panic(MyError{})
}).Catch(MyError{}, func(err error) {
println("catch MyError")
}).CatchAll(func(err error) {
println("catch error")
}).Finally(func() {
println("finally do something")
})
println("done")
}
実行結果
$ go run trycatch.go
do something buggy
catch MyError
finally do something
done
注意点として、Try、Catchなど呼んだあと、Finallyを呼ばないと例外をキャッチしてくれないです。
なんか上手い書き方思いついたら改善してみる。
最後に
今のところ、try-catchが用意されていないことで問題になったことは特にないし、自分はこれ使わないだろうと思いました。
あと、Goとtry-catchの話、以前twitterでもちょいちょいネタに上がってますね(参考:mattnさんのブログ記事)。