错误
运行时错误
在运行代码时, 会发生一些非拼写的错误, 例如:
除零错误
1 / 0
// 输出: division by zero
数组越界
arr = [1]
arr[8] // 尝试读取索引为8的元素, 但实际上长度仅为1
// 输出: reflect: slice index out of range
Go原生错误
在调用Go标准库、第三方库时, 会有很多方法返回值为[结果…, 错误信息], 例如
// Go标准库 - 字符串转整型方法
strconv.Atoi("NaN")
在Go中, 以上方法的签名是
package strconv
...
func Atoi(s string) (int, error) {
...
}
返回值包含int和error类型, 此时Z1h返回的结果是一个数组:
res = strconv.Atoi("NaN")
// 输出: [ 0, { "Func": "Atoi", "Num": "NaN", "Err": {} } ]
此时可以通过对第[1]个参数是否为空来校验是否抛出了错误, 如果为空, 则[0]是需要的结果
res = strconv.Atoi("NaN")
if (res[1]) {
print('产生了错误:', res[1].Error())
} else {
print('得到了答案:', res[0])
}
可以将上例的"NaN"替换成"123"试试
抛出错误
当代码运行到某处, 需要强行中断后续操作并将错误信息往上传递时, 需要抛出异常
- 调用
panic
函数即可抛出错误 - 调用
assert
方法时, 传入的参数内如果包含错误, 也会抛出其中的错误
示例
panic的用法
panic("Bye")
print("这里不会被执行")
// 输出: Panic at call func: Bye
assert的用法
print(assert(strconv.Atoi("123")))
print(assert(strconv.Atoi("NaN")))
print("这里不会被执行")
// 第一行会输出123
// 第二行会抛出错误
// 第三行会被第二段打断, 不会被执行
错误处理
try catch代码块
Z1h语言中, 可以使用try {...} catch(e) {...}
代码块来统一捕获抛出的异常
如下文, 捕获了字符串转整型的异常并处理
var str = "不是数字"; // 可以替换成"888"试试
try {
var num = assert(strconv.Atoi(str));
print("得到了数字:", num);
} catch (e) {
print(`字符串 ${str} 不是一个合法的整型: ${e.Error()}`);
}
?? + recover 捕获
可参考 运算符 > ?? 操作符
> recover
学习如何使用 ??
和 recover
进行错误的捕获和处理
示例:
panic(123) ?? recover(err=>`抛出的内容是: ${err.Origin()}`)