Обработка ошибок в APL

В настоящее время я работаю над программой APL для класса и столкнулся с проблемой обработки ошибок.

В функции, которую я сделал, я хочу проверить, что входные данные являются целыми числами. Если это не так, я хочу вернуть сообщение об ошибке и не запускать остальные функции. Пока я сравниваю, чтобы увидеть, равен ли он самому полу. Если нет, я не хочу, чтобы функция работала, и хочу, чтобы она остановилась. Работает если я поставлю 4.2 и выдает сообщение об ошибке, но не работает, если я ставлю что-то вроде 'A' в или 'ABCDEF' и просто выдает нормальную ошибку. Я попытался сделать оператор try catch, но он выдал ошибку, когда :Try в моей функции.

Что не то, что я хочу. Как я могу сделать так, чтобы функция заканчивалась сообщением об ошибке, а не продолжалась, если вводом является символ или строка? Я знаю, что мог бы поместить весь код в блок if, но это кажется действительно ненужным.

Мой код в виде простого текста:

 TESTER Q;error
 :If Q≢⌊Q
     'Possible'
 :Else
     'Not Possible'
 :EndIf
 'Again, Possible'

И как скриншот:

Скриншот

1 ответ

Если вы хотите явно выйти рано, чтобы не включать весь код в :If блок, вы можете сделать что-то вроде:

 r←TESTER Q
 :If 0≢⊃0⍴⊂Q ⍝ Q not a simple scalar number
 :OrIf Q≢⌊Q  ⍝ Q not an integer
     r←'Not Possible'
     →0
 :EndIf
 r←'Possible'

Это работает с использованием прототипов APL:

⊂Q обязательно справится Q в целом.
0⍴ делает пустой список этого "типа".
вытесняет прототип элемента, который так же, как Q но со всеми символами, преобразованными в пробелы, и со всеми числами, преобразованными в нули. Сейчас если Q был простым скалярным числом, прототип 0так что мы проверяем на это.

Попробуйте онлайн!

Однако для вашей функции было бы правильнее отклонить неверный аргумент, выдав реальную ошибку, а не возвращая или распечатывая результат (который неявно нужно понимать как ошибку), чтобы функция, вызывающая ваш, могла перехватить ошибку и принять соответствующие меры. Следующее:

 r←TESTER Q
 :If 0≢⊃0⍴⊂Q ⍝ Q not a simple scalar number
 :OrIf Q≢⌊Q  ⍝ Q not an integer
     'Not Possible'⎕SIGNAL 11
 :EndIf
 r←'Possible'

Попробуйте онлайн!

⎕SIGNAL При необходимости выдает ошибку (левый аргумент) с пользовательским сообщением, а правый аргумент является номером ошибки из этого списка. Ошибка № 11 - ОШИБКА ДОМЕНА, которая является подходящей в этом случае.


Я понял, что вы пытались использовать :Try но получил ошибку на этом. Из-за вашего тега и скриншота я могу сказать, что вы используете Dyalog APL, синтаксис которого:

 :Trap 4 5 6 10 11 16
     code to try goes here
 :CaseList 4 5
     handling of rank and length errors go here
 :Case 6
     handling of value errors goes here
 :Else
     all other trapped errors are handled here
 :EndTrap
 untrapped errors will throw as usual

Опять же, используются номера ошибок из приведенного выше списка. (:Try это другая система захвата ошибок, используемая в APLX.)

Другие вопросы по тегам