[Option, Result, Error Handling] to change current Error Handling
igotfr opened this issue · comments
Igor Ferreira commented
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`
Igor Ferreira commented
related:
vlang/v#12740
#7
vlang/v#12151