Написал макрос, чтобы кривая строка в hosts-файле логировалась, а загрузка шла дальше. Вот он целиком:
(defmacro with-lenient-parse ((&key (log t)) &body body)
`(handler-bind ((missing-field
(lambda (c)
(when ,log
(format *error-output* "skipping: ~A~%" c))
nil))
(bad-port
(lambda (c)
(when ,log
(format *error-output* "warn: ~A~%" c))
nil)))
,@body))
У parse-line есть рестарт skip-line, но я не уверен, что его вообще кто-то вызывает. Вход — name addr [port], один хост на строку, запускаю через sh run.sh.
Когда в файле есть web-02 (без addr), в stderr получаю skipping: line 2: missing addr. Потом SBCL падает в отладчик с той же самой ошибкой missing-field, и скрипт умирает. Я думал, что если вернуться из хендлера, то parse-line вернёт nil для этой строки, нет? Видимо, нет.
Чтобы пройти дальше, я удалил строку с web-02. Теперь получаю warn: line 4: bad port abc, а потом type error в privileged-p: NIL is not of type NUMBER. Эта функция к парсингу вообще не относится. Условие для порта — просто signal подкласса warning, и ничего из написанного мной не считает его фатальным.
Это два бага или одно непонимание того, как хендлер встраивается? Что вообще макрос обещает вызывающему коду? Пишу по памяти из транскрипта, так что полный бэктрейс вставить не могу.