Почему IGNSIGNAL не перехватывается :: охранниками ошибок? - PullRequest
2 голосов
/ 05 мая 2019
      {11::¯1 ⋄ 2÷0}⍬
¯1
      {11::¯1 ⋄ ⎕SIGNAL 11}⍬
DOMAIN ERROR

Почему первый сигнал перехватывается, а второй нет?

1 Ответ

1 голос
/ 05 мая 2019

Согласно документации для ⎕SIGNAL (мой акцент):

Индикатор состояния сокращен для выхода из функции или оператор, содержащий строку, которая вызвала ⎕SIGNAL, или обрезается для выхода из выражения Execute (), которое вызвало ⎕SIGNAL.Если выполняется внутри вложенного dfn, индикатор состояния обрезается для выхода из капсулы, содержащей строку, которая вызвала ⎕SIGNAL.Затем генерируется ошибка.

Другими словами, к тому времени, когда ⎕SIGNAL завершает свою работу, мы уже вне dfn и, таким образом, защита от ошибок dfn (::)больше не действует.

Чтобы обойти это, вы должны использовать ⎕SIGNAL в отдельной капсуле.Например, вы можете определить функцию покрытия вне функции, в которой вы хотите ее использовать:

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

В качестве альтернативы, вы можете поместить ⎕SIGNAL в свою собственную капсулу выполнения:

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