Ccmmutty logo
Commutty IT
0 pv2 min read

第15話 V言語のエラー・例外処理を考える。

https://cdn.magicode.io/media/notebox/blob_FlqgUIG
カサレリア。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の様にリカバリはないようなので、リトライは呼び出し元か、処理元でやることになりそうです。
他になにかいい案や、こうしているなどありましたら、教えていただけると幸いです。
V言語でもScalaやHaskellのようにモナドとか書こうと思えば、多分行けるのだと思います。是非、コメントで教えて下さい。
次回、「V言語の正規表現」見てください!

Discussion

コメントにはログインが必要です。