Option/Result types & error handling


struct User {
    id int 
    name string
} 

struct Repo {
    users []User 
} 

fn new_repo() Repo {
    return Repo {
        users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}]
    }
} 

fn (r Repo) find_user_by_id(id int) ?User { 
    for user in r.users {
        if user.id == id {
            // V automatically wraps this into an option type  
            return user 
        } 
    } 
    return error('User $id not found') 
} 

fn main() {
    repo := new_repo() 
    user := repo.find_user_by_id(10) or { // Option types must be handled by `or` blocks  
        return  // `or` block must end with `return`, `break`, or `continue`  
    } 
    println(user.id) // ==> "10"  
    println(user.name) // ==> 'Charles'
}

V将Option和Result组合成一种类型,因此您无需决定使用哪种类型。

将函数“升级”为可选函数所需的工作量很小:您必须添加一个?返回类型并在出现错误时返回错误。

如果您不需要返回错误,则只能return none。 (TODO:none还没有实现)。

这是V中处理错误的主要方法。它们仍然是值,但是错误处理要简洁很多。

当然,错误是可以被传递的:

resp := http.get(url)?
println(resp.body)

http.get返回的是?http.Response可选类型。如果错误发生,将传播到调用函数,这里是导致main函数抛出异常。

上面代码是下面代码的简写:

resp := http.get(url) or {
    panic(err)
}
println(resp.body)

V没有办法强制打开一个可选项(比如Rustunwrap()Swift中的!)。 你必须使用或{panic(err)}代替。

results matching ""

    No results matching ""