Ignoring timeouts in Drakma
Luís Oliveira
luismbo at gmail.com
Wed Jun 12 23:19:56 UTC 2013
On Wed, Jun 12, 2013 at 11:23 PM, Patrick May <patrick.may at mac.com> wrote:
>> (defun try-request-from-multiple-urls (&rest urls)
>> (loop
>> (with-simple-restart (try-next "Try next URL")
>> (handler-case
>> (let ((url (first urls)))
>> (format t "requesting ~A~%" url)
>> (return (drakma:http-request url)))
>> (usocket:timeout-error ()
>> (setf urls (rest urls))
>> (unless urls
>> (format t "no more urls, returning~%")
>> (return))
>> (format t "timeout, trying next url~%")
>> (invoke-restart 'try-next))))))
>>
>> Tune as desired. If you want to have the last timeout error percolate to the caller, you'll want handler-bind instead.
>
> Thanks, Hans (and Drew C). I figured out my problem on the train home (debugging by public embarrassment), but your use of with-simple-restart makes the code more understandable so I'll incorporate that.
Restarts are nice, but usually for communicating with other call
sites. Seems a bit overkill here. If I understand your problem, all
you need is handler-case really.
(defun poll-urls (urls)
(dolist (url urls)
(handler-case (drakma:http-request url)
(usocket:timeout-error ()
(format t "got timeout getting ~A~%" url)))))
Cheers,
--
Luís Oliveira
http://r42.eu/~luis/
More information about the Drakma-devel
mailing list