函数定义时,返回类型前面加?,表示这个函数可能返回一个错误

    在函数代码中根据逻辑丢出错误:

    return error(‘error message’) 或 return none 表示抛出错误

    函数调用时,使用or代码块来处理错误,默认会传递err参数给or代码块,包含错误信息,

    or代码块必须以:return/panic/exit/continue/break结尾

    1. fn my_fn(i int) ?int {
    2. if i == 0 {
    3. return error('Not ok!') //抛出错误,err的值为Not ok!
    4. // return Error{msg:'Not ok!', code: 1} //直接使用Error类型也可以,效果一样
    5. }
    6. if i == 1 {
    7. return none //抛出错误,但是没有错误信息,err的值为空字符串
    8. }
    9. return i //正常返回
    10. }
    11. fn my_fn2(i int) ?(int, int) { //多返回值时,?放在括号前面
    12. return 1,1
    13. }
    14. fn main() {
    15. //函数调用
    16. //触发错误,执行or代码块,程序中断,报错:V panic: Not ok!
    17. v1 := my_fn(0) or {
    18. panic(err.msg) //默认会传递err参数给or代码块,包含错误信息
    19. }
    20. //触发错误,执行or代码块,因为是return none,所以err为空,
    21. v2 := my_fn(1) or {
    22. println('from 1')
    23. if err.msg == '' {
    24. println('err is empty')
    25. }
    26. return
    27. }
    28. println(v2)
    29. //未触发错误,不执行or代码块,返回函数的返回值
    30. v3 := my_fn(2) or {
    31. println('from 2')
    32. return
    33. }
    34. println(v3)
    35. }

    if守护条件处理错误:

    for循环结合or代码块使用:

    1. module main
    2. import os
    3. fn main() {
    4. // 报错
    5. // for line in os.read_lines('不存在的文件') or { panic('文件不存在') } {
    6. println(line)
    7. }
    8. }

    若函数无返回值,仍需抛出错误,要使用?

    1. module main
    2. fn main() {
    3. exec('') or {
    4. //约定的变量名err
    5. panic('error text is :$err.msg;error code is $err.code')
    6. }
    7. }
    8. fn exec(stmt string) ? {
    9. if stmt == '' {
    10. return error_with_code('stmt is null', 123) //需要带错误码
    11. }
    12. println(stmt)
    13. }

    http.get函数中,定义的返回值是:?Response

    当用上面的方式调用get函数时,如果触发了错误,错误会被向上抛转给调用get函数的上级函数,

    上级函数的返回类型必须也有错误处理,如果上级函数是main主函数,那么就会以panic的方式处理错误

    类似以下的代码:

    1. resp := http.get(url) or {
    2. panic(err)