Ignoring timeouts in Drakma
Patrick May
patrick.may at mac.com
Thu Jun 13 01:33:30 UTC 2013
On Jun 12, 2013, at 7:19 PM, Luís Oliveira <luismbo at gmail.com> wrote:
> 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)))))
I ultimately went completely underkill and used ignore-error. I need a shower now.
Thanks,
Patrick
More information about the Drakma-devel
mailing list