可选类型和错误处理

  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)