error_handle
SKILL.md
仓颉语言错误处理 Skill
1. 异常层次与定义
1.1 两种基础异常类型
Error— 内部系统/资源耗尽错误。应用程序不应抛出或继承Error。仅用于安全终止程序Exception— 逻辑错误、IO 错误、数组越界等。这些须被捕获处理。开发者可以继承Exception创建自定义异常
1.2 自定义异常规则
- ❌ 不能继承
Error或其子类 - ✅ 可使用
<:继承Exception或其子类 - 使用
open class允许进一步继承;使用class表示最终异常
1.3 Exception API
| 类型 | 签名 | 说明 |
|---|---|---|
| 构造函数 | init() |
默认构造函数 |
| 构造函数 | init(message: String) |
带消息构造函数 |
| 属性 | open prop message: String |
详细消息 |
| 方法 | open func toString(): String |
类型名 + 消息 |
| 方法 | func getClassName(): String |
类名;子类须重写 |
| 方法 | func printStackTrace(): Unit |
打印堆栈跟踪到 stderr |
1.4 Error API
| 类型 | 签名 | 说明 |
|---|---|---|
| 属性 | open prop message: String |
详细消息 |
| 方法 | open func toString(): String |
类型名 + 消息 |
| 方法 | func printStackTrace(): Unit |
堆栈跟踪到 stderr |
2. 抛出与处理异常
2.1 throw 关键字
throw <expr>其中<expr>须为Exception子类型(不能抛出Error)- 未处理的异常调用默认处理器,或通过以下方式注册自定义处理器:
Thread.handleUncaughtExceptionBy(exHandler: (Thread, Exception) -> Unit): Unit
2.2 普通 try 表达式
三个块:try、catch(0+)、finally(有 catch 时可选,无 catch 时须有)
语法示例
try {
throw NegativeArraySizeException("error!")
} catch (e: NegativeArraySizeException) {
println(e)
} catch (e: IllegalArgumentException | ArithmeticException) {
println("Other exception: ${e}")
} catch (_) {
println("Unknown exception")
} finally {
println("cleanup")
}
规则
try块:包含可能抛出异常的代码。定义独立作用域catch块:使用 catchPattern 通过模式匹配捕获异常。首个匹配的 catch 执行;后续 catch 被跳过。编译器在 catch 不可达(被前面的 catch 遮蔽)时发出警告finally块:无论是否有异常始终执行。用于清理。避免在 finally 中抛出异常。即使异常未被捕获也会执行(然后重新抛出)- 每个
try/catch块有独立作用域
try 表达式类型
- try 块 + 所有 catch 块的最小公共父类型(不包括 finally)
- 若 try 表达式的值未使用,类型为
Unit
2.3 try-with-resources 表达式
用于自动资源管理。资源声明在 try 和 {} 之间。
关键规则
catch和finally块可选- 资源须实现
Resource接口:interface Resource { func isClosed(): Bool func close(): Unit } - 多个资源用
,分隔 - 资源变量作用域 = 体作用域
- try-with-resources 表达式的类型始终为
Unit
语法
try (r = Worker("Tom")) {
r.getTools()
r.work()
} // 若 r.isClosed() == false 则自动调用 r.close()
2.4 CatchPattern
类型模式
- 单类型:
Identifier: ExceptionClass— 捕获该类及子类,绑定到Identifier - 联合类型:
Identifier: E1 | E2 | ... | En— 捕获任意列出的类型。绑定变量类型为所有列出类型的最小公共父类型
通配符模式
_— 捕获任何异常(等价于e: Exception)。无绑定
3. 使用 Option 处理错误
Option<T>(简写 ?T)表示值的存在(Some(v))或缺失(None)
3.1 四种解构/使用方式
(a) 模式匹配(match)
match (p) {
case Some(x) => "${x}"
case None => "none"
}
(b) 合并运算符 ??
e1 ?? e2— 若e1为Some(v)返回解包值,否则返回e2
(c) 问号运算符 ?(可选链)
- 配合
.、()、[]、{}(尾随 Lambda)使用 e?.b→ 若e == Some(v)则Some(v.b),否则None- 支持多级链式调用:
a?.b.c?.d— 首个None处短路 - 支持可选链上的赋值:
c1?.item = 200(None时为空操作)
(d) getOrThrow() 函数
Some(v)时返回解包值None时抛出NoneValueException
4. 内置运行时异常
| 异常 | 说明 |
|---|---|
ConcurrentModificationException |
并发修改错误 |
IllegalArgumentException |
非法或不正确的参数 |
NegativeArraySizeException |
以负数大小创建数组 |
NoneValueException |
值不存在 |
OverflowException |
算术溢出 |
Weekly Installs
3
Repository
kong-baiming/cangjie-devFirst Seen
3 days ago
Installed on
opencode2
gemini-cli2
claude-code2
github-copilot2
codex2
kimi-cli2