Обработка ошибок в 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.)