カサレリア。katzenです。
ゲームやAPIについて書いて間が空きましたが、エラー、例外処理について考えたいと思います。
V言語には、golangと同じ様にtry/catch/finalyのような例外をハンドリングする機構がありません。
恥ずかしながら命令型言語に慣れている私だと、1つの関数内で処理を書くときこんな感じでよく書きます。
function hoge(args) {
try {
res1 = func1(args)
res2 = func2(res1)
} catch (e) {
log(e)
return false
}
return true
}
が、golangやV言語ではかけません。
ではどうするかですが、私はこうしてみました。
// error.v
fu hoge(args) bool {
mut e := "error!"
defer {
if "" != e { log(e) }
}
res1 = func1(args) or { return false }
res2 = func2(res1) or { return false }
e = ""
return true
}
defer
を用いて、エラー時にログを残して、その場で処理を抜けることが出来ます。
呼び出し元までエラーを返す機構でいいなら、複数返却したりerrorを返すように ?
をつけて
fn hoge(args int) ?bool {
res1 := func1(args) or { return error("error func1") }
res2 := func2(res1) or { return error("error func2") }
return true
}
fn main() {
hoge(0) or { log(err) }
}
こうしてもいいのではないでしょうか。
しかしgolangの様にリカバリはないようなので、リトライは呼び出し元か、処理元でやることになりそうです。
他になにかいい案や、こうしているなどありましたら、教えていただけると幸いです。