Валидация
При создании надежных плагинов важно убедиться, что наши функции корректно обрабатывают ошибки и работают должным образом, даже в случаях неправильного использования или неожиданных входных данных. Проверка помогает защитить целостность функции и предотвратить сбои или непреднамеренное поведение.
Давайте посмотрим, как мы можем улучшить функцию send-message, добавив проверки, чтобы убедиться, что она правильно обрабатывает входные данные.
Проверка входных данных
Прежде чем отправлять сообщение, мы должны убедиться, что аргумент output, переданный функции send-message, действителен. Мы можем добавить проверку, чтобы подтвердить, что место назначения вывода является одним из ожидаемых значений (gui, консоль ошибок или терминал).
Пример:
(define (send-message message output)
;; Validate the output argument
(if (not (member output '(gui error-console terminal)))
(error "Invalid output destination: " output)
(cond
;; Send to the Error Console
((eq? output 'error-console)
(lumi-message-set-handler 2)
(lumi-message message))
;; Send to the GUI dialog box
((eq? output 'gui)
(lumi-message-set-handler 0)
(lumi-message message))
;; Send to the terminal window
((eq? output 'terminal)
(display message))))
;; Restore the default message handler to the Error Console
(lumi-message-set-handler 2))В этом примере мы используем member, чтобы проверить допустимость аргумента output. В противном случае функция выдает ошибку с четким сообщением, предотвращая возникновение проблем с недопустимыми значениями.
Обработка пустых сообщений
Также полезно убедиться, что аргумент message действителен. Например, если в качестве сообщения передается пустая строка или #f (false), функция должна обработать это корректно.
Пример обработки пустого сообщения:
(define (send-message message output)
;; Check if the message is empty
(if (or (not message) (string=? message ""))
(error "Message cannot be empty")
(cond
((eq? output 'error-console)
(lumi-message-set-handler 2)
(lumi-message message))
((eq? output 'gui)
(lumi-message-set-handler 0)
(lumi-message message))
((eq? output 'terminal)
(display message))))
(lumi-message-set-handler 2))Такой подход гарантирует, что функция всегда получает действительные входные данные, что повышает ее надежность и предотвращает непредвиденное поведение.
Пример комбинированной проверки
;; Function to handle message output to various destinations
(define (send-message message output)
;; Validate the message and output arguments
(if (or (not (string? message)) (string=? message ""))
(error "Message must be a non-empty string")
(if (not (member output '(gui error-console terminal)))
(error "Invalid output destination: " output)
(cond
;; Send to the Error Console
((eq? output 'error-console)
(lumi-message-set-handler 2)
(lumi-message message))
;; Send to the GUI dialog box
((eq? output 'gui)
(lumi-message-set-handler 0)
(lumi-message message))
;; Send to the terminal window
((eq? output 'terminal)
(display message)))))
;; Restore the default message handler to the Error Console
(lumi-message-set-handler 2))В этой версии:
- Функция сначала проверяет, является ли
messageпустым или недействительным. Если сообщение действительно, происходит проверка, является лиoutputодним из принятых значений (gui,error-consoleилиterminal). - Если обе проверки пройдены, сообщение отправляется на соответствующий выход. В противном случае выдается сообщение об ошибке с четким объяснением.
- Выполняется дополнительная проверка, чтобы убедиться, что сообщение также является строкой.
Эта комбинированная функция проверки обеспечивает чистоту кода и гарантирует, что оба входных данных проверяются перед выполнением каких-либо действий, что делает функцию более надежной. Обратите внимание: мы также создаем систему обмена сообщениями отладки. Когда код терпит неудачу, мы получаем причину, причину, которую мы написали сами.
Execution error for 'Hello loaded!':
Error: Message must be a non-empty stringExecution error for 'Hello loaded!':
Error: Invalid output destination: gu