if、when、循环、break/continue 与
try。
条件分支
基本语法
if 用于按条件选择不同的表达式结果:
if后跟条件表达式。then后跟条件为true时计算的表达式。else后跟条件为false时计算的表达式。- 整个
if ... then ... else ...是一个表达式,可以直接作为函数返回值或赋值右侧:
多行与嵌套写法
当分支逻辑较复杂时,可以用代码块书写,并在if 中嵌套使用:
- 花括号
{ ... }表示一个代码块。 - 块内可以包含多条语句,块的结果是最后一个表达式的值,或者显式
return的值。 if是表达式,可以作为更大表达式的一部分,也可以嵌套出现在else分支中。
多分支选择
when 提供了更灵活的多分支选择语法,支持按条件测试和按值匹配两种用法。
条件模式
在条件模式下,when 按顺序测试每个条件:
- 花括号内部每一行是一个“条件 -> 结果表达式”。
- 会自上而下依次计算条件表达式,返回第一个为
true的分支右侧结果。 else分支是可选分支,用于兜底情况。- 如果省略
else且没有任何条件命中,则结果为null:
值匹配
在值匹配模式下,when 先对一个表达式求值,然后与各个分支左侧的值做相等比较:
when expr { ... }会先计算expr,再依次与每个分支左侧的值比较。- 适合枚举值、常量分支、简单状态码等场景。
- 同样支持
else作为兜底分支。
与其他表达式组合
when 是表达式,可以绑定为变量、作为函数返回值,或嵌入到更大的表达式中:
循环
Fluxon 提供for 和 while 两种循环形式,它们都可以在循环体中使用 break 和 continue。
for-in 循环
for 用于遍历列表、区间或映射等可迭代值。
遍历列表
- 语法为
for 标识符 in 可迭代表达式 { ... }。 - 在循环体中通过
&标识符访问当前元素。
遍历映射(键值对)
当可迭代值是键值对集合时,你可以直接解构当前项:- 使用解构
(key, value)遍历键值对。 - 具体迭代顺序由底层集合类型决定,例如字典或环境变量。
遍历区间
区间由a..b(闭区间)或 a..<b(左闭右开)创建:
while 循环
while 在条件为 true 时重复执行循环体:
- 每次进入循环体之前都会计算条件表达式。
- 条件结果为
false或null时循环结束。 - 条件表达式可以引用外层变量,也可以调用函数:
终止与跳过
终止:break
break 用于提前结束当前循环:
- 立即结束最内层的
for或while。 - 循环之后的语句会继续执行。
break 也可以配合 when 或函数调用使用,只要位置在循环体内即可。
跳过:continue
continue 用于跳过当前迭代剩余的语句,直接进入下一轮:
- 当前迭代中,
continue之后的语句不会执行。 - 下一轮迭代从条件检查开始。
- 在多重嵌套循环中,
continue只作用于最内层循环。
异常处理
Fluxon 提供throw 与 try / catch / finally 结构来处理运行时错误。
和其他控制结构一样,try 是一个表达式,可以产生值。
抛出异常
使用throw(expr) 可以在任意位置显式抛出异常:
try 包裹时,throw 会中断当前脚本的执行,向外抛出一个运行时异常。
expr 的值会作为异常的消息或原因被传递到底层运行时:
作为表达式
try 是一个完整的表达式,用来包裹可能出错的代码,并在出错时给出替代值:
求值规则概括如下:
- 正常情况:
- 先执行
try { ... }块。 - 如果没有抛出异常,
try表达式的结果就是try块最后一个表达式的值。 - 如果存在
finally,仍然会在返回前执行finally(见下文)。
- 先执行
- 出错情况:
- 如果
try块中抛出了异常,会跳转到后续的catch。 - 没有匹配的
catch时,异常会继续向外传播。仅写try { ... }而不写catch/finally时,常用于“保证 finally 执行”或调试。
- 如果
try 是表达式,它可以出现在赋值、函数调用参数、甚至其他表达式内部:
处理异常
catch 用于捕获异常并返回一个替代值。Fluxon 支持两种常见写法:
-
省略异常变量:只关心出错时的兜底结果,不关心异常对象本身:
-
带异常变量:需要访问异常对象的详细信息,例如类型或消息:
catch块本身是一个代码块,最后一个表达式的值(或显式return的值)会成为整条try表达式在出错时的结果。- 如果
try块没有抛出异常,对应的catch块不会执行。
最终执行
finally 用于那些不关心结果,只关心“必须执行”的逻辑,例如日志、资源释放或计时:
- 执行
try块。 - 若发生异常,执行
catch块;catch的返回值作为候选结果。 - 不论是否发生异常,都执行
finally块。 - 如果
finally正常结束,则try表达式的结果为:- 正常情况下:
try块的结果。 - 出错且被捕获的情况下:
catch块的结果。
- 正常情况下:
finally 内部再次抛出异常时,才会覆盖原本的结果,改为向外抛出新的异常。
否则,finally 不会改变 try / catch 已经决定好的值。
链式用法与简写形式
在 Fluxon 中,可以把多个异常处理片段写成一条链,形成紧凑的错误恢复逻辑:try、catch、finally 部分写在一行上:
- 对于一两行的简单逻辑,简写更紧凑。
- 涉及多步操作或需要访问异常对象时,推荐使用块体形式并显式写出
(e)。