Перевірка
Під час створення надійних плагінів важливо, щоб функції коректно обробляли помилки та працювали навіть при неправильному використанні або неочікуваних вхідних даних. Перевірка захищає цілісність функції та запобігає збоям і небажаній поведінці.
Розглянемо, як покращити функцію send-message, додавши перевірки вхідних даних.
Перевірка аргументів
Перед надсиланням повідомлення переконайтеся, що аргумент output у send-message дійсний. Можна перевірити, що пункт призначення — один із очікуваних (gui, error-console або terminal).
Приклад:
(define (send-message message output)
;; Перевірити аргумент output
(if (not (member output '(gui error-console terminal)))
(error "Invalid output destination: " output)
(cond
;; Консоль повідомлень
((eq? output 'error-console)
(lumi-message-set-handler 2)
(lumi-message message))
;; Діалогове вікно GUI
((eq? output 'gui)
(lumi-message-set-handler 0)
(lumi-message message))
;; Вікно терміналу
((eq? output 'terminal)
(display message))))
;; Повернути обробник за замовчуванням — консоль повідомлень
(lumi-message-set-handler 2))Тут member перевіряє, чи output допустимий. Якщо ні — функція викликає error із зрозумілим повідомленням.
Обробка порожніх повідомлень
Також корисно перевірити аргумент message. Якщо передано порожній рядок або #f, функція має відреагувати акуратно.
Приклад:
(define (send-message message output)
;; Перевірити, чи повідомлення не порожнє
(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))Це гарантує валідні вхідні дані та підвищує надійність функції.
Комбінований приклад перевірки
;; Надсилання повідомлення на різні виходи
(define (send-message message output)
;; Перевірити message та output
(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
;; Консоль повідомлень
((eq? output 'error-console)
(lumi-message-set-handler 2)
(lumi-message message))
;; Діалогове вікно GUI
((eq? output 'gui)
(lumi-message-set-handler 0)
(lumi-message message))
;; Вікно терміналу
((eq? output 'terminal)
(display message)))))
;; Повернути обробник за замовчуванням — консоль повідомлень
(lumi-message-set-handler 2))У цій версії:
- спочатку перевіряється, чи
messageне порожній і є рядком; - потім — чи
outputодин із допустимих (gui,error-console,terminal); - якщо обидві перевірки пройдені, повідомлення надсилається; інакше —
errorіз поясненням.
Ця комбінована перевірка тримає код чистим і гарантує перевірку обох аргументів перед діями. Зверніть увагу: ми також закладаємо основу системи налагоджувальних повідомлень. Коли код падає, ми отримуємо причину — ту, яку написали самі.
Execution error for 'Hello loaded!':
Error: Message must be a non-empty stringExecution error for 'Hello loaded!':
Error: Invalid output destination: gu