Обработка исключений AllegroServe

Как можно избежать получения ошибки при передаче в качестве аргумента функции do-http-request неверного хоста.
Есть ли способ, которым я могу поймать ошибку, как механизм обработки исключений в Java?

1 ответ

Решение

Конечно, у CL очень хорошая система условий. Одним из простых вариантов будет завершение вызова do-http-request в ignore-errors, который возвращает nil (и условие в качестве второго значения), если в завернутом коде было указано условие ошибки. Вы можете проверить nil после этого.

Если вы хотите что-то более похожее на обработку исключений в Java, просто используйте handler-case и добавьте соответствующее предложение об ошибке (у меня не установлен AllegroServe, но я полагаю, вы получите socket-error для предоставления неправильного URL - просто измените эту часть, если я неправильно прочитал):

(handler-case
    (do-http-request …)
  (socket-error ()
    …))

Если тебе надо finally -подобная функциональность, использование unwind-protect:

(unwind-protect
     (handler-case
         (do-http-request …)
       (socket-error (condition) ; bind the signalled condition
         …)                      ; code to run when a socket-error was signalled
       (:no-error (value)        ; bind the returned value
         …))                     ; code to run when no condition was signalled
  …)                             ; cleanup code (finally)

Вы даже можете получить больше фантазии, и, например, использовать handler-bind обрабатывать стек условий вверх, вызывая перезапуск где-то вниз по стеку, не раскручивая его. Например, если do-http-request при условии перезапуска, чтобы повторить попытку с другим URL-адресом, вы можете обработать свое состояние ошибки, вызвав этот перезапуск с новым URL-адресом, чтобы повторить попытку. Я просто упомянул об этом для полноты картины - это было бы излишним для вашего варианта использования, но возможность возобновления (возможно, дорогостоящих) вычислений легко может оказаться довольно удобной функцией.

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