【发布时间】:2019-05-06 14:43:21
【问题描述】:
{11::¯1 ⋄ 2÷0}⍬
¯1
{11::¯1 ⋄ ⎕SIGNAL 11}⍬
DOMAIN ERROR
为什么第一个信号被捕获,而第二个没有?
【问题讨论】:
标签: error-handling scope apl dyalog
{11::¯1 ⋄ 2÷0}⍬
¯1
{11::¯1 ⋄ ⎕SIGNAL 11}⍬
DOMAIN ERROR
为什么第一个信号被捕获,而第二个没有?
【问题讨论】:
标签: error-handling scope apl dyalog
根据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
【讨论】: