• 可选类型和错误处理

    可选类型和错误处理

    1. struct User {
    2. id int
    3. name string
    4. }
    5. struct Repo {
    6. users []User
    7. }
    8. fn new_repo() Repo {
    9. return Repo {
    10. users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}]
    11. }
    12. }
    13. fn (r Repo) find_user_by_id(id int) ?User {
    14. for user in r.users {
    15. if user.id == id {
    16. // V automatically wraps this into an option type
    17. return user
    18. }
    19. }
    20. return error('User $id not found')
    21. }
    22. fn main() {
    23. repo := new_repo()
    24. user := repo.find_user_by_id(10) or { // Option types must be handled by `or` blocks
    25. return // `or` block must end with `return`, `break`, or `continue`
    26. }
    27. println(user.id) // ==> "10"
    28. println(user.name) // ==> 'Charles'
    29. }

    V语言针对函数返回值增加了一个可选的属性,这样可以用于处理失败的情况。

    将函数升级到可选类型的返回值很简单,只需要给返回值类型增加一个?就可以,这样就可以区别错误和真正的返回值。

    如果不需要返回错误信息,可以简单返回Node(TODO:还没有实现)。

    这是V语言处理错误的主要手段。函数的返回值依然是值,但是错误处理要简洁很多。

    当然,错误还可以继续传播:

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

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

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

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