【问题标题】:Why is ⎕SIGNAL not caught by :: error guards?为什么 ⎕SIGNAL 没有被 :: 错误守卫捕获?
【发布时间】:2019-05-06 14:43:21
【问题描述】:
      {11::¯1 ⋄ 2÷0}⍬
¯1
      {11::¯1 ⋄ ⎕SIGNAL 11}⍬
DOMAIN ERROR

为什么第一个信号被捕获,而第二个没有?

【问题讨论】:

    标签: error-handling scope apl dyalog


    【解决方案1】:

    根据the documentation for ⎕SIGNAL(我的重点):

    状态指示器是切回退出函数或包含调用⎕SIGNAL的行的运算符,或者切回退出执行(@987654324 @) 调用 ⎕SIGNAL 的表达式。如果在嵌套的 dfn 中执行,则状态指示符将被切回以退出包含调用 ⎕SIGNAL 的行的胶囊。然后会生成错误。

    换句话说,当 ⎕SIGNAL 完成它的工作时,我们已经在 dfn 之外,因此 dfn 的错误保护 (::) 不再有效。

    要解决此问题,您必须在单独的胶囊中使用⎕SIGNAL。例如,您可以在要使用它的函数外部定义一个覆盖函数:

          Signal←{⎕SIGNAL ⍵}
          {11::¯1 ⋄ Signal 11}⍬
    ¯1
    

    或者,您可以将⎕SIGNAL 放入自己的执行胶囊中:

          {11::¯1 ⋄ ⍎'⎕SIGNAL 11'}⍬
    ¯1
    

    【讨论】:

      猜你喜欢
      • 2017-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2017-06-18
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多