# 结果 (Result) 类型与错误处理
在玄铁语言中,没有传统的 `try-catch` 异常抛出机制(即不会因为一个错误导致整个程序崩溃)。相反,玄铁借鉴了 Rust 语言的优雅设计,使用 `结果` (Result) 类型来显式处理可能失败的操作。
## 概念与底层结构
`结果` 是一个内置的泛型数据容器。在底层的 C 运行时 (`xt_runtime.h`) 中,它被定义为一个名为 `XTResult` 的结构体,包含三个核心字段:
1. **状态位 (`is_success`)**:标记这个结果是成功还是失败。
2. **成功值 (`value`)**:如果成功,这里存储具体的返回值。
3. **错误信息 (`error`)**:如果失败,这里存储错误原因(通常是一段字符串)。
## 如何创建 `结果`
在代码中,你可以使用内置函数 `成功()` 和 `失败()` 来打包返回值:
```xuantie
函 除法(a, b) {
若 b == 0 {
返 失败("除数不能为零")
}
返 成功(a / b)
}
```
## 如何消费 `结果`
当你调用一个返回 `结果` 的函数时,你有两种处理方式:
### 方式一:手动解包(严谨)
```xuantie
设 结 = 除法(10, 2)
若 结.成功 {
示("计算结果: " + 结.值)
} 否 {
示("发生错误: " + 结.错误)
}
```
### 方式二:使用错误冒泡操作符 `?`(快捷)
如果你不想在每一层都写 `若 结.成功`,可以在表达式后加上 `?` 操作符。
```xuantie
设 值 = 除法(10, 2)?
// 👆 编译器遇到 ? 会自动展开为:
// 如果成功,把 "值" 赋给左边;
// 如果失败,立刻终止当前函数,并将这个 "失败" 结果 return 给上一层调用者。
```
当然,你也可以这样写:
```xuantie
设 值 = 除法(10, 2)
设 真值 = 值 ?
// ↑ 标识符允许以 ? 结尾(如 存在?),变量名与 ? 之间必须留空格,否则会被词法器读成一个标识符
```