跳转到内容

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);

由于返回最终是一个异常,遇到返回将导致立即结束函数体的处理。

但是,此异常会被设置函数调用的解释器部分捕获,并且不允许进一步传播。


继承 · 惰性求值

华夏公益教科书