Sway 参考手册/异常
外观
当解释器检测到代码中的错误时,就会发生异常。这些错误可能是语法错误或语义错误。您之前已经看到过异常的后果:未定义变量异常、除以零异常等等。
当生成异常时,据说它被引发或抛出。除非捕获异常,否则它将终止当前函数调用的处理,然后向上传播,终止进行调用的函数的处理,等等。
除非异常被捕获(见下一节),否则如果执行文件,异常最终将终止 Sway 解释器。如果 Sway 正在交互式运行,处理将终止到(但不包括)提示读取评估循环(带有sway>和more>提示)。
可以使用catch函数停止异常的传播。catch的唯一参数是一个可能生成异常的表达式。catch函数评估其参数,如果未引发异常,则返回评估表达式的值。如果引发了异常,catch将异常转换为错误对象。
以下是 catch 的典型用法
var x = catch(process(a,b)); if (x is :ERROR && x . type == :mathError) { x = 0; } else if (x is :ERROR) { throw(x); } ...
请注意,如果您捕获了异常,但事实证明您不想处理它,您可以使用throw函数重新抛出它。
您可以使用throw函数的不同用法生成自己的异常。这种throw的用法需要两个参数。这些参数可以是任何东西,但按照惯例,第一个参数是符号,第二个参数是字符串,提供有关错误的更多解释。例如,假设您希望在变量应该为偶数但实际上不是的情况下引发异常
if (x % 2 == 1) { throw(:oddValue,"x is " + x + ", it should be even."); }
如果您包含基础库,您可以使用'try函数,它简化了异常的捕获和处理。以下是之前显示的典型用法的版本
var error; ... try (error) { x = process(a,b); } else if (error . type == :mathError) { x = 0; } else { throw(error); } ...
try函数要求将一个变量作为第一个参数传递;如果发生异常,它将把此变量设置为捕获的异常。
return函数生成类型为:return的特殊异常,因此表达式
return x + y;
等效于
throw(:return,x + y);
由于返回最终是一个异常,遇到返回将导致立即结束函数体的处理。
但是,此异常会被设置函数调用的解释器部分捕获,并且不允许进一步传播。