可选类型和错误处理

1. struct User {
2. id int
3. name string
4. }

6. struct Repo {
7. users []User
8. }

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

16. fn (r Repo) find_user_by_id(id int) ?User {
17. for user in r.users {
18. if user.id == id {
19. // V automatically wraps this into an option type
20. return user
21. }
22. }
23. return error('User $id not found')
24. }

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

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)