Обработка исключений 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-адресом, чтобы повторить попытку. Я просто упомянул об этом для полноты картины - это было бы излишним для вашего варианта использования, но возможность возобновления (возможно, дорогостоящих) вычислений легко может оказаться довольно удобной функцией.