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.



More information about the Drakma-devel mailing list