vlang / rfcs

RFCs for changes to V

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

[Option, Result, Error Handling] to change current Error Handling

igotfr opened this issue · comments

fn e(x int) !int { // implicitly any Error
  if x < 5 {
    return 8
  }
  return error('greater than or equal 5')
}

fn n(x int) ?int { // implicitly None
  if x < 5 {
    return 8
  }
  return none
}

struct MyError1 {
  msg string
  code int
}

struct MyError2 {
  msg string
  code int
}

struct MyError3 {
  msg string
  code int
}

fn f(x int) (MyError1 | MyError3) ! int {
  if x < 5 {
    return 8
  } else if x < 10 {
    return MyError1{msg: 'Error'} // without IError()
  }
  return MyError3{msg: 'Invalid'}
}

println(f(4) or { println(err.msg) return }) // 8
println(f(9) or { println(err.msg) return }) // Error
println(f(12) or { println(err.msg) return }) // Invalid

fn g(x int) (MyError1 | MyError3) ? int {
// same as:
// fn g(x int) (MyError1 | MyError3 | None) ! int {
  if x < 5 {
    return 8
  } else if x  < 10 {
    return MyError1{msg: 'Error'}
  } else if x < 15 {
    return MyError3{msg: 'Invalid'}
  }
  return none
}

println(g(4) or { println(err.msg) return }) // 8
println(g(9) or { println(err.msg) return }) // Error
println(g(12) or { println(err.msg) return }) // Invalid
println(g(17) or { println(err) return }) // none

fn f_invalid(x int) (MyError1 | MyError3) ! int {
  if x < 5 {
    return 8
  } else if x  < 10 {
    return MyError1{msg: 'Error'}
  } else if x < 15 {
    return MyError2{msg: 'Invalid'}
  }
  return MyError3{msg: 'Failure'}
}

println(f_invalid(4) or { println(err.msg) return }) // `compile error`
println(f_invalid(9) or { println(err.msg) return }) // `compile error`
println(f_invalid(12) or { println(err.msg) return }) // `compile error`
println(f_invalid(17) or { println(err) return }) // `compile error`

fn g_invalid(x int) (MyError1 | MyError3) ! int {
  if x < 5 {
    return 8
  } else if x  < 10 {
    return MyError1{msg: 'Error'}
  } else if x < 15 {
    return MyError3{msg: 'Invalid'}
  }
  return none
}

println(g_invalid(4) or { println(err.msg) return }) // `compile error`
println(g_invalid(9) or { println(err.msg) return }) // `compile error`
println(g_invalid(12) or { println(err.msg) return }) // `compile error`
println(g_invalid(17) or { println(err) return }) // `compile error`